|
發布時間: 2018-5-16 21:17
正文摘要:這是ds1302中寫字節的一部分,我想問問這部分里邊的這個for循環,里邊的那個dat一次不是只能傳輸一個位嗎?最終是怎么傳出來一個字節的呢?每次循環不應該都重新來了嗎?所以就不懂了,麻煩看見的幫我解答解答,萬分 ... |
| 取最低位,傳一位移一位,八次 |
| 是每次傳送一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右移一位 } |