工控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 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答