软件模拟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();//拉高关闭使能
他只是向前航行,脚下是沉静碧蓝的大海,而头顶是金色的太阳。