#include "spi_if.h" #include #include /*! \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; }