STC单片机软件模拟SPI 兼容类比芯片SPI驱动
/* analogysemi xutong 2024/1/23 */ #ifndef __BSP_LPSPI_H #define __BSP_LPSPI_H #include "config.h" #define SPI_SCLK(x) P25=(x) #define SPI_MOSI(x) P23=(x) #define SPI_MISO P24 #define SPI_CS1(x) P22=(x) #define SPI_CS2(x) P21=(x) void LPSPI_Init(void); void Lpspi_Write(uint8_t datasize,uint8_t *datas); void Lpspi_Read(uint8_t datasize,uint8_t *datas,uint8_t *Rxdata); #endif /* __BSP_LPSPI_H */
#include "bsp_lpspi.h" #include "STC8xxxx.H" void LPSPI_Init(void) { //设置除了MISO为输入外,其他为输出模式 P2M0 = 0xEF; //设置P2.0~P2.7为推挽输出模式 P2M1 = 0x10; } void SPI_Transmit_Data_mode1(uint8_t *TXData ,uint8_t Size) //SCLK low second edge { uint8_t i,a=0,datas=0; for(a=0;a<Size;a++) { datas = TXData[a]; for(i = 0;i < 8;i++) { SPI_SCLK(1); if(datas&(0x80))//data bit = 1 { SPI_MOSI(1);//MOSI SET 1 } else { SPI_MOSI(0);//MOSI SET 1 } datas <<=1; SPI_SCLK(0); } } } void SPI_Receive_Data_mode1( uint8_t *TXData,uint8_t *Rxdata ,uint8_t Size) //SCLK low second edge { uint8_t i,a,datas; for(a=0;a<Size;a++) { datas = TXData[a]; Rxdata[a]=0; for(i = 0;i < 8;i++) { SPI_SCLK(1); if(datas&(0x80))//data bit = 1 { SPI_MOSI(1);//MOSI SET 1 } else { SPI_MOSI(0);//MOSI SET 0 } datas <<=1; SPI_SCLK(0); if(SPI_MISO==1) { Rxdata[a]|=(0x80 >>i); } } } } void Lpspi_Write(uint8_t datasize,uint8_t *datas) { SPI_Transmit_Data_mode1(datas,datasize); } void Lpspi_Read(uint8_t datasize,uint8_t *datas,uint8_t *Rxdata) { SPI_Receive_Data_mode1(datas,Rxdata,datasize); }