1. 程式人生 > 實用技巧 >軟體模擬spi c語言實現

軟體模擬spi c語言實現

//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();//拉高關閉使能