工控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 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 C++行情软件的tick数据如何高效的合成K线
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
  • ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战
  • ¥15 svpwm波形异常求解答