/* * 函数:user_spi_read_byte * 说明:SPI读取一个字节 */ u8 ICACHE_FLASH_ATTR user_spi_read_byte(void) { u8 read = 0; #if defined(HARD_SPI) u32 recv_data[1]; SpiData spiData; spiData.cmd = MASTER_READ_DATA_FROM_SLAVE_CMD; spiData.cmdLen = 0; spiData.addr = NULL; spiData.addrLen = 0; spiData.data = recv_data; spiData.dataLen = 1; SPIMasterRecvData(SpiNum_HSPI, &spiData); read = (u8)(recv_data[0]&0xFF); #elif defined(SOFT_SPI) u8 i; CS_0(); for (i = 0; i < 8; i++){ SCK_0(); //user_spi_delay_us(50); read = read<<1; if (MISO_IS_HIGH()){ read++; } SCK_1(); //user_spi_delay_us(50); } CS_1(); #endif return read; }
/* * 函数:user_spi_write_byte * 说明:SPI写一个字节 */ void ICACHE_FLASH_ATTR user_spi_write_byte(u8 data) { #if defined(HARD_SPI) u32 send_data[1] = {data}; SpiData spiData; spiData.cmd = MASTER_WRITE_DATA_TO_SLAVE_CMD; spiData.cmdLen = 0; spiData.addr = NULL; spiData.addrLen = 0; spiData.data = send_data; spiData.dataLen = 1; SPIMasterSendData(SpiNum_HSPI, &spiData); #elif defined(SOFT_SPI) u8 i; CS_0(); for(i = 0; i < 8; i++){ if (data & 0x80){ MOSI_1(); }else{ MOSI_0(); } SCK_0(); data <<= 1; //user_spi_delay_us(50); SCK_1(); } CS_1(); #endif }
/* ********************************************************************************************************* * 函 数 名: bsp_SetSpiSck * 功能说明: 用于软件模式。设置SCK GPIO的状态。在函数CS=0之前被调用,用于不同相序的SPI设备间切换。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ #ifdef SOFT_SPI /* 软件SPI */ void bsp_SetSpiSck(uint8_t _data) { if (_data == 0) { SCK_0(); } else { SCK_1(); } }
//接收8个bit数据,不带片选CS static unsigned char TM7705_Recive8Bit() { unsigned char i; unsigned char retc = 0; for (i = 0; i < 8; i++) { SCK_0(); retc <<= 1; if (DO_IS_HIGH()) { retc++; } SCK_1(); } return retc; }
//发送8个bit数据,不带片选CS static void TM7705_Send8Bit(unsigned char _data) { unsigned char i; for(i = 0; i < 8; i++) { if (_data & 0x80) { DI_1(); } else { DI_0(); } SCK_0(); _data <<= 1; SCK_1(); } }
/* ********************************************************************************************************* * 函 数 名: bsp_spiRead0 * 功能说明: 从SPI总线接收8个bit数据。 SCK上升沿采集数据, SCK空闲时为低电平。 * 形 参: 无 * 返 回 值: 读到的数据 ********************************************************************************************************* */ uint8_t bsp_spiRead0(void) { #ifdef SOFT_SPI /* 软件SPI */ uint8_t i; uint8_t read = 0; for (i = 0; i < 8; i++) { read = read<<1; if (MISO_IS_HIGH()) { read++; } SCK_1(); bsp_spiDelay(); SCK_0(); bsp_spiDelay(); } return read; #endif #ifdef HARD_SPI /* 硬件SPI */ uint8_t read; /* 等待发送缓冲区空 */ while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); /* 发送一个字节 */ SPI_I2S_SendData(SPI1, 0); /* 等待数据接收完毕 */ while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); /* 读取接收到的数据 */ read = SPI_I2S_ReceiveData(SPI1); /* 返回读到的数据 */ return read; #endif }
/* ********************************************************************************************************* * 函 数 名: TM7705_Send8Bit * 功能说明: 向SPI总线发送8个bit数据。 不带CS控制。 * 形 参: _data : 数据 * 返 回 值: 无 ********************************************************************************************************* */ static void ICACHE_FLASH_ATTR TM7705_Send8Bit(u8 data) { //user_spi_write_byte(data); #if defined(SOFT_SPI) u8 i; CS_0(); for(i = 0; i < 8; i++){ if (data & 0x80){ MOSI_1(); }else{ MOSI_0(); } TM7705_Delay_us(50); SCK_0(); data <<= 1; TM7705_Delay_us(50); SCK_1(); } CS_1(); #endif }
/* ********************************************************************************************************* * 函 数 名: bsp_spiWrite0 * 功能说明: 向SPI总线发送一个字节。SCK上升沿采集数据, SCK空闲时为低电平。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_spiWrite0(uint8_t _ucByte) { #ifdef SOFT_SPI /* 软件SPI */ uint8_t i; for(i = 0; i < 8; i++) { if (_ucByte & 0x80) { MOSI_1(); } else { MOSI_0(); } bsp_spiDelay(); SCK_1(); _ucByte <<= 1; bsp_spiDelay(); SCK_0(); } bsp_spiDelay(); #endif #ifdef HARD_SPI /* 硬件SPI */ /* 等待发送缓冲区空 */ while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); /* 发送一个字节 */ SPI_I2S_SendData(SPI1, _ucByte); /* 等待数据接收完毕 */ while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); /* 读取接收到的数据 */ SPI_I2S_ReceiveData(SPI1); #endif }
/* ********************************************************************************************************* * 函 数 名: TM7705_Read2Byte * 功能说明: 读2字节数据 * 形 参: 无 * 返 回 值: 读取的数据(16位) ********************************************************************************************************* */ static uint16_t ICACHE_FLASH_ATTR TM7705_Read2Byte(void) { u16 read = 0; #if 0 read = user_spi_read_2byte(); #else u8 i; CS_0(); for (i = 0; i < 16; i++){ SCK_0(); //TM7705_Delay_us(20); read = read<<1; if (MISO_IS_HIGH()){ read++; } SCK_1(); //TM7705_Delay_us(50); } CS_1(); #endif return read; }
/* ********************************************************************************************************* * 函 数 名: TM7705_Recive8Bit * 功能说明: 从SPI总线接收8个bit数据。 不带CS控制。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ static u8 ICACHE_FLASH_ATTR TM7705_Recive8Bit(void) { u8 read = 0; //read = user_spi_read_byte(); #if defined(SOFT_SPI) u8 i; CS_0(); for (i = 0; i < 8; i++){ SCK_0(); TM7705_Delay_us(50); read = read<<1; if (MISO_IS_HIGH()){ read++; } SCK_1(); TM7705_Delay_us(50); } CS_1(); #endif return read; }