工控BLUCK 2021-12-16 11:51 采纳率: 69%
浏览 25
已结题

ADC模拟SPI理解不了移位

ADC读写程序,有点理解不了写程序:右移7位,再左移一位就能把数据保存在DIN了?读程序:为什么要左移一位,放的是最高位还是最低位啊?

/****************************************************************************
*函数名:SPI_Write
*输  入:dat:写入数据
*输  出:无
*功  能:使用SPI写入数据
****************************************************************************/

void SPI_Write(uchar dat)
{
    uchar i;
    CLK = 0;
    for(i=0; i<8; i++)
    {
        DIN = dat >> 7;      //放置最高位
        dat <<= 1;
        CLK = 0;            //上升沿放置数据

        CLK = 1;

    }
}
/****************************************************************************
*函数名:SPI_Read
*输  入:无
*输  出:dat:读取 到的数据
*功  能:使用SPI读取数据
****************************************************************************/

uint SPI_Read(void)
{
    uint i, dat=0;
    CLK = 0;
    for(i=0; i<12; i++)        //接收12位数据
    {
        dat <<= 1;

        CLK = 1;
        CLK = 0;

        dat |= DOUT;

    }
    return dat;    
}


  • 写回答

2条回答 默认 最新

  • qllaoda 2021-12-16 13:26
    关注

    这个时序应该是最高位在先发送,右移7位剩下的就是最高位,注意在第一句,只是读data的最高位,data本身并没有变,下面一句data左移1位,是把data的次高位推到最高位,这样下一轮循环读到的就是data的次高位。所以并不是你说的那样右移7位再左移1位就写到DIN了,而是右移7位就已经把最高位写到DIN了,左移1位是为了下一次操作。读程序那边,最开始读到的肯定也是最高位,但是暂时放在最低位,通过7次移位之后,就变成最高位了,之所以不一开始就放到最高位,是为了减少移位运算次数,因为本来就要移位,何必一个移动7位,一个6位,一个5位的这样麻烦呢。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月19日
  • 已采纳回答 12月19日
  • 创建了问题 12月16日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵