软件模拟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();//拉高关闭使能


 
 
posted @ 2020-11-23 15:01  HuDaXia  阅读(1686)  评论(0编辑  收藏  举报