9ceb218f80
Co-authored-by: Cursor <cursoragent@cursor.com>
146 lines
3.7 KiB
C
146 lines
3.7 KiB
C
#include "spi_if.h"
|
|
#include <gd32h7xx_spi.h>
|
|
#include <gd32h7xx_gpio.h>
|
|
|
|
|
|
|
|
/*!
|
|
\brief SPIx发送数据 (私有函数)
|
|
\param[in] spi_periph: SPIx(x=0,1,2,3,4,5)
|
|
\param[in] data: 要发送的数据(uint8_t,一次发送1个字节!!)
|
|
\param[out] none
|
|
\retval none
|
|
*/
|
|
void spi_transmit_byte(uint32_t spi_periph, uint8_t data)
|
|
{
|
|
/* 等待发送缓冲区有空间 */
|
|
while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TP));
|
|
|
|
/* 发送数据 */
|
|
spi_i2s_data_transmit(spi_periph, data);
|
|
}
|
|
|
|
/*!
|
|
\brief SPIx接收数据 (私有函数)
|
|
\param[in] spi_periph: SPIx(x=0,1,2,3,4,5)
|
|
\param[in] none
|
|
\param[out] none
|
|
\retval 接收到的数据(uint8_t 一次接收1个字节)
|
|
*/
|
|
uint8_t spi_receive_byte(uint32_t spi_periph)
|
|
{
|
|
/* 等待接收缓冲区非空 */
|
|
while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_RP));
|
|
|
|
/* 接收数据 */
|
|
return (uint8_t)spi_i2s_data_receive(spi_periph);
|
|
}
|
|
|
|
/*!
|
|
\brief SPIx发送接收数据 (私有函数)
|
|
\param[in] spi_periph: SPIx(x=0,1,2,3,4,5)
|
|
\param[in] tx_data: 要发送的数据
|
|
\param[out] none
|
|
\retval 接收到的数据
|
|
*/
|
|
uint8_t spi_transmit_receive_byte(uint32_t spi_periph, uint8_t tx_data)
|
|
{
|
|
/* 等待发送缓冲区有空间 */
|
|
while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TP));
|
|
|
|
/* 发送数据 */
|
|
spi_i2s_data_transmit(spi_periph, tx_data);
|
|
|
|
/* 等待接收缓冲区非空 */
|
|
while(RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_RP));
|
|
|
|
/* 接收数据 */
|
|
return (uint8_t)spi_i2s_data_receive(spi_periph);
|
|
}
|
|
|
|
/*!
|
|
\brief 控制SPI设备的片选引脚
|
|
\param[in] dev: SPI设备结构体指针
|
|
\param[in] enable: 1-选中设备, 0-取消选中
|
|
\param[out] none
|
|
\retval none
|
|
*/
|
|
void spi_cs_control(spi_dev_t *dev, uint8_t enable)
|
|
{
|
|
if (dev && dev->csPort) {
|
|
if (enable) {
|
|
/* 拉低片选引脚,选中设备 */
|
|
gpio_bit_reset((uint32_t)dev->csPort, dev->csPin);
|
|
} else {
|
|
/* 拉高片选引脚,取消选中设备 */
|
|
gpio_bit_set((uint32_t)dev->csPort, dev->csPin);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief 控制SPI设备的复位引脚
|
|
\param[in] dev: SPI设备结构体指针
|
|
\param[in] enable: 1-复位, 0-正常
|
|
\param[out] none
|
|
\retval none
|
|
*/
|
|
void spi_rst_control(spi_dev_t *dev, uint8_t enable)
|
|
{
|
|
if (dev && dev->rstPort) {
|
|
if (enable) {
|
|
/* 拉低复位引脚,复位设备 */
|
|
gpio_bit_reset((uint32_t)dev->rstPort, dev->rstPin);
|
|
} else {
|
|
/* 拉高复位引脚,设备正常工作 */
|
|
gpio_bit_set((uint32_t)dev->rstPort, dev->rstPin);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief 初始化SPI设备
|
|
\param[in] dev: SPI设备结构体指针
|
|
\param[in] spi_periph: SPI外设
|
|
\param[in] csPort: 片选GPIO端口
|
|
\param[in] csPin: 片选GPIO引脚
|
|
\param[in] rstPort: 复位GPIO端口
|
|
\param[in] rstPin: 复位GPIO引脚
|
|
\param[out] none
|
|
\retval 0: 成功, -1: 失败
|
|
*/
|
|
int spi_init_dev(spi_dev_t *dev, uint32_t spi_periph, uint32_t csPort, uint16_t csPin, uint32_t rstPort, uint16_t rstPin)
|
|
{
|
|
if (!dev) {
|
|
return -1;
|
|
}
|
|
|
|
/* 初始化设备结构体 */
|
|
dev->spi = spi_periph;
|
|
dev->csPort = csPort;
|
|
dev->csPin = csPin;
|
|
dev->rstPort = rstPort;
|
|
dev->rstPin = rstPin;
|
|
dev->initialized = 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*!
|
|
\brief 去初始化SPI设备
|
|
\param[in] dev: SPI设备结构体指针
|
|
\param[out] none
|
|
\retval 0: 成功, -1: 失败
|
|
*/
|
|
int spi_deinit_dev(spi_dev_t *dev)
|
|
{
|
|
if (!dev || !dev->initialized) {
|
|
return -1;
|
|
}
|
|
|
|
dev->initialized = 0;
|
|
return 0;
|
|
}
|
|
|
|
|