TiSmartCar/source/bsp/bsp_spi.c
Boen_Shi 8be2866433 feat(base): 初始化 MSPM0 开发环境
- 添加头文件和配置文件支持
- 更新.gitignore忽略编译和IDE相关文件
- 添加基础的bsp代码
2026-07-16 14:45:26 +08:00

133 lines
4.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <bsp_spi.h>
#include <stdint.h>
void Soft_SPI_APIs_Register(SSAS *spi_dev,void(*Soft_SPI_GPIO_Port_Init)(void),
void(*Soft_SPI_SCK)(uint8_t state),
void(*Soft_SPI_MOSI)(uint8_t state),
uint8_t(*Soft_SPI_MISO)(void),
void(*Soft_SPI_CS)(uint8_t state),
void(*Soft_SPI_CS2)(uint8_t state),
void(*Soft_SPI_CS3)(uint8_t state)) {
spi_dev->Soft_SPI_GPIO_Port_Init = Soft_SPI_GPIO_Port_Init;
spi_dev->Soft_SPI_SCK = Soft_SPI_SCK;
spi_dev->Soft_SPI_MOSI = Soft_SPI_MOSI;
spi_dev->Soft_SPI_MISO = Soft_SPI_MISO;
spi_dev->Soft_SPI_CS = Soft_SPI_CS;
spi_dev->Soft_SPI_CS2 = Soft_SPI_CS2;
spi_dev->Soft_SPI_CS3 = Soft_SPI_CS3;
}
void Soft_SPI_Init(SSAS *spi_dev) {
if (spi_dev->Soft_SPI_GPIO_Port_Init != NULL) {
spi_dev->Soft_SPI_GPIO_Port_Init(); // Initialize SPI GPIO ports
}
spi_dev->Soft_SPI_SCK(1); // Set SCK high
spi_dev->Soft_SPI_MOSI(1); // Set MOSI high
spi_dev->Soft_SPI_CS(1); // Set CS high
#if (SPI_CS2)
spi_dev->Soft_SPI_CS2(1); // Set CS2 high
#endif
#if (SPI_CS3)
spi_dev->Soft_SPI_CS3(1); // Set CS3 high
#endif
}
#if (!SPI_MISO && SPI_MOSI)
void Soft_SPI_SendByte(SSAS *spi_Dev,uint8_t Byte) {
uint8_t i;
/*循环8次主机依次发送数据的每一位*/
for (i = 0; i < 8; i++) {
/*使用掩码的方式取出Byte的指定一位数据并写入到D1线*/
/*两个!的作用是让所有非零的值变为1*/
spi_Dev->Soft_SPI_MOSI(!!(Byte & (0x80 >> i)));
spi_Dev->Soft_SPI_SCK(1); // 拉高D0从机在D0上升沿读取SDA
spi_Dev->Soft_SPI_SCK(0); // 拉低D0主机开始发送下一位数据
}
}
#else if (SPI_MISO && SPI_MOSI) || (SPI_MISO && !SPI_MOSI)
uint8_t Soft_SPI_RecvByte(SSAS *spi_Dev,uint8_t Byte) {
uint8_t i;
uint8_t DATA_IN = 0;
/*循环8次主机依次接收数据的每一位*/
for (i = 0; i < 8; i++) {
spi_Dev->Soft_SPI_SCK(1); // 拉高D0从机在D0上升沿读取SDA
if (spi_Dev->Soft_SPI_MISO()) {
DATA_IN |= (1 << (7 - i)); // 读取MISO线状态
}
spi_Dev->Soft_SPI_SCK(0); // 拉低D0主机开始接收下一位数据
}
return DATA_IN;
}
#endif
#if (SPI_MISO && SPI_MOSI) || (SPI_MISO && !SPI_MOSI)
uint8_t *Soft_SPI_SwapData(SSAS *spi_Dev, uint8_t *data, uint16_t len) {
#else if (!SPI_MISO && SPI_MOSI)
void Soft_SPI_SwapData(SSAS *spi_Dev, uint8_t *data, uint16_t len) {
#endif
uint8_t i, j;
uint8_t *DATA_OUT = data;
uint8_t *DATA_IN;
for (i = 0; i < len; i++) {
for (j = 0; j < 8; j++) {
#if (SPI_MOSI)
// 数据输出
spi_Dev->Soft_SPI_MOSI(!!(DATA_OUT[i] & (0x80 >> i)));
#endif
#if (SPI_MISO)
// 数据输入
if (spi_Dev->Soft_SPI_MISO()) {
DATA_IN[i] |= (1 << (7 - j));
} else {
DATA_IN[i] &= ~(1 << (7 - j));
}
#endif
spi_Dev->Soft_SPI_SCK(1);
spi_Dev->Soft_SPI_SCK(0);
}
}
#if (MISO && MOSI) || (MISO && !MOSI)
return DATA_IN;
#else if (!MISO && MOSI)
#endif
}
#if (SPI_MISO && SPI_MOSI)
uint8_t Soft_SPI_SwapBytes(SSAS *spi_Dev, uint8_t data) {
#else if (!SPI_MISO && SPI_MOSI)
void Soft_SPI_SwapBytes(SSAS *spi_Dev, uint8_t data) {
#endif
uint8_t i;
uint8_t DATA_IN = 0;
/*循环8次主机依次发送数据的每一位*/
for (i = 0; i < 8; i++) {
#if (SPI_MOSI)
spi_Dev->Soft_SPI_MOSI(!!(data & (0x80 >> i)));
#endif
#if (SPI_MISO)
// 数据输入
if (spi_Dev->Soft_SPI_MISO()) {
DATA_IN |= (1 << (7 - i));
} else {
DATA_IN &= ~(1 << (7 - i));
}
#endif
spi_Dev->Soft_SPI_SCK(1); // 拉高D0从机在D0上升沿读取SDA
spi_Dev->Soft_SPI_SCK(0); // 拉低D0主机开始发送下一位数据
}
#if (MISO && MOSI) || (MISO && !MOSI)
return DATA_IN;
#else if (!MISO && MOSI)
#endif
}