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


 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM