再來貼一次,SPI在讀寫某芯片【芯片不同可能有差異】寄存器地址的時候,一般都會進行addr|0x80,實際上0x80是一個操作碼。相當於把最高位置1,群里有人說也是定位作用。
sx1278的讀寫時序圖:
/************************************************************************** * 函數名:SPI_SendByte * 描述 :SPI模塊發送函數 * 輸入 :發送數據 * 返回 :返回數據 *************************************************************************/ u8 SPI_SendByte(u8 byte) { u8 i = 0; u8 bit_r = 0; for(i=0;i<8;i++) // output 8-bit { //MOSI_PIN=byte & 0x80; //output 'byte' MSB to MOSI_PIN if(byte & 0x80) //判斷最高位是否為1 MOSI_H; else MOSI_L; byte <<= 1; // shift next bit into MSB.. SCLK_H; bit_r<<=1; if(MISO_G) bit_r++; SCLK_L; //SCK_PIN=1 ; // Set SCK_PIN high.. //byte|=MISO_PIN; // capture current MISO_PIN bit //SCK_PIN=0; // then set SCK_PIN low again } return(bit_r); // return read byte } /************************************************************************** * 函數名:SPI_ReadRegister * 描述 :SPI讀取寄存器數值 * 輸入 :寄存器地址 * 返回 :數據 *************************************************************************/ u8 SPI_ReadRegister (u8 addr) { u8 Result; CS_L; //nSEL = 0; SPI_SendByte(addr); //write data into the SPI register Result = SPI_SendByte(0xFF); //0XFF其實就是偽字節 CS_H; //nSEL = 1; return(Result); } /************************************************************************** * 函數名:SPI_WriteRegister * 描述 :SPI寫寄存器數值 * 輸入 :寄存器地址,數值 * 返回 :無 *************************************************************************/ void SPI_WriteRegister (u8 addr, u8 value) { CS_L; //nSEL = 1; SPI_SendByte(addr|0x80); //0X80 spi的最高位是一般協議定位命令位,是讀數據或寫數據標識
SPI_SendByte(value); CS_H; //nSEL = 1; }