工控BLUCK 2021-12-16 11:51 采纳率: 78.3%
浏览 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日

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程