軟體模擬spi c語言實現
阿新 • • 發佈:2020-11-23
//spi資料寫入驅動 void SPI_SEND_BYTE(uint8_t data) { uint8_t i = 0; uint8_t tmp = data; for (i = 0; i < 8; i++) { SIMU_SPI_SCK_L(); sleep_us(1); if (tmp & 0x80) { SIMU_SPI_SDA_H(); } else { SIMU_SPI_SDA_L(); } sleep_us(1); SIMU_SPI_SCK_H(); sleep_us(1); tmp <<= 1; sleep_us(1); } } //spi資料讀取驅動 uint16_t SPI_RECV_BYTE(void) { uint16_t data = 0; uint8_t i = 0; SIMU_SPI_SDA_INPUT(); SIMU_SPI_SCK_L(); for (i = 0; i < 16; i++) { sleep_us(1); data<<= 1; sleep_us(1); SIMU_SPI_SCK_H(); sleep_us(1); if (IS_SIMU_SPI_SDA_H()) { data |= 0x01; } sleep_us(1); SIMU_SPI_SCK_L(); } SIMU_SPI_SDA_OUTPUT(); return data; } //寫暫存器資料 void WriteReg_shell(uint8_t addr, uint16_t word) { SIMU_SPI_SDA_OUTPUT(); SIMU_SPI_SCK_L(); SPI_NSS_ACTIVE(); uint16_t temp= word >> 8; SPI_SEND_BYTE(addr); SPI_SEND_BYTE((temp)&0xFF); SPI_SEND_BYTE((word)&0xFF); SPI_NSS_INACTIVE(); } //讀暫存器資料 uint16_t ReadReg_shell(uint8_t addr) { uint16_t word; SIMU_SPI_SDA_OUTPUT(); SIMU_SPI_SCK_L(); SPI_NSS_ACTIVE(); uint8_t tmp_addr = (addr | 0x80); SPI_SEND_BYTE(tmp_addr); sleep_us(2); word = SPI_RECV_BYTE(); SPI_NSS_INACTIVE(); return word; }
程式碼說明:
前面兩個函式是讀取/寫入的時序
後面兩個函式是讀取裝置暫存器的demo程式碼
其中需要註冊進去的介面
一、設定spi clk引腳高低
SIMU_SPI_SCK_H();
SIMU_SPI_SCK_L();
二、設定spi data引腳高低
SIMU_SPI_SDA_H();
SIMU_SPI_SDA_L();
三、設定spi data引腳輸入輸出模式
SIMU_SPI_SDA_OUTPUT();
SIMU_SPI_SDA_INPUT();
四、設定spi NSS引腳高低(spi使能)
SPI_NSS_ACTIVE();//拉低開啟使能
SPI_NSS_INACTIVE();//拉高關閉使能