取最低位,传一位移一位,八次 |
是每次传送一bit,传8次就是一个Byte了。如果要传输很多Byte,就连续调用这个循环。 |
从你给的程序上第一句看,dat是8位,不是一位。 从最低位开始传 DSIO是一位,当DSIO=dat时,自动取低位。 所以你就可以看到八位数啦 希望对你能有帮助 |
![]() 仔细理解下这两句 |
每次传输一个位,循环8次不正好一个字节吗 |
一个字节是8位。for循环里面循环8次,每一次循环把dat里面的数据给DSIO寄存器,然后dat获得value右移一位后的数据,8次共传输一个字节。for循环8次后,进入下一个函数。 |
134849694164151 发表于 2018-5-17 00:33 就像8个人排队跳水,一次只跳下一个,后面的人依次向前移动一位,直至跳完。addr >>= 1; // 把addr右移一位 |
134849694164151 发表于 2018-5-17 00:33 从你给的程序上看,dat是8位,不是一位。 主要是你想不通:为什么一个8位数据去给一个一位赋值?! 其实很简单:DSIO是一位,当DSIO=dat时,自动取低位。 你自己可以做实验的:对一个unsigned char 型变量,赋值0x1234,你会发现,最后得到的自动就是0x34,高位自动去掉了。 |
图片里的东西在这里 for (i=0; i<8; i++) { dat = addr & 0x01; // SPI是从低位开始传输的 DSIO = dat; // 把要发送的bit数据丢到IO引脚上去准备好 SCLK = 1; // 制造上升沿,让DS1302把IO上的值读走 delay(); // 读走之后,一个小周期就完了 SCLK = 0; // 把SCLK拉低,是为了给下一个小周期做准备 delay(); addr >>= 1; // 把addr右移一位 } // 第3部分: 写入第2字节,value for (i=0; i<8; i++) { dat = value & 0x01; // SPI是从低位开始传输的 DSIO = dat; // 把要发送的bit数据丢到IO引脚上去准备好 SCLK = 1; // 制造上升沿,让DS1302把IO上的值读走 delay(); // 读走之后,一个小周期就完了 SCLK = 0; // 把SCLK拉低,是为了给下一个小周期做准备 delay(); value = value >> 1; // 把addr右移一位 } |