本帖最后由 abner_ma 于 2023-7-1 21:17 编辑
SPI,Serial Peripheral interface 串行外围设备接口。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间,驱动TFT LCD显示屏 高速数据显示也越来越常见。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,杰发科技AC7802x,支持串行、同步、全双工协议。SPI 模块包含主机和从机并以 4 线方式进行通信。
支持一主多从,实现高速通信。
UART、SPI、I2C三种串行总线对比:
SPI是“全双工”,具有单独的发送和接收线路,因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。这比异步串行通信所需的完整UART要简单得多,可以完成高速通信;
杰发科技AC7802x SPI模块特性:
主机模式或从机模式操作
全双工模式
主机可编程波特率
串行时钟相位和极性选择
可配置连续或不连续 CS (从机选择) 输出
带 CPU 中断功能的模式错误标志位
可供选择的最高有效位(MSB)优先或 最低有效位(LSB)优先移位
可配置的 CS 建立时间,保持时间和空闲时间
可配置的 SCK 高和低周期
4-16 位传输帧格式选择
带中断功能的 TX 缓冲区下溢及 RX 缓冲区溢出标志位
从机支持停止(Stop)模式唤醒功能
支持主从模式采用轮询阻塞模式发送接收数据,中断模式发送接收数据。SPI在通信的时候里面是一个FIFO的缓冲区,环形缓冲区,只需要把接收数据和发送数据按照环形缓冲区的方式来进行读取和发送。
- void SPI_MasterInit(void)
- {
- /*! 初始化SPI引脚,功能复用选择.*/
- GPIO_SetFunc(GPIOB, GPIO_PIN5, GPIO_FUN3); /*! SCK */
- GPIO_SetFunc(GPIOA, GPIO_PIN7, GPIO_FUN3); /*! MOSI */
- GPIO_SetFunc(GPIOB, GPIO_PIN4, GPIO_FUN3); /*! MISO */
- GPIO_SetFunc(GPIOA, GPIO_PIN6, GPIO_FUN3); /*! CS */
- /*! 清零配置结构体变量.*/
- memset(&spiConfig, 0x00, sizeof(spiConfig));
- /*! 初始化SPI参数,波特率 = 2Mbps = (F_BCLK / (SCK_LOW+1 + SCK_HIGH+1)).*/
- spiConfig.csSetup = 4; /*! 片选建立时间 = (CS_SETUP + 1) * CLK_PERIOD.*/
- spiConfig.csHold = 4; /*! 片选保持时间 = (CS_HOLD + 1) * CLK_PERIOD.*/
- spiConfig.sckHigh = 3; /*! SCK高电平时间 = (SCK_HIGH + 1) * CLK_PERIOD.*/
- spiConfig.sckLow = 3; /*! SCK低电平时间 = (SCK_LOW + 1) * CLK_PERIOD.*/
- spiConfig.csIdle = 4; /*! 两条数据间最短时间间隔 = (CS_IDLE + 1) * CLK_PERIOD.*/
- spiConfig.mode = SPI_MASTER; /*! 设置为主机模式*/
- spiConfig.cpha = SPI_CPHA_2EDGE; /*! 设置数据采样相位,第2个边沿采样数据*/
- spiConfig.cpol = SPI_CPOL_HIGH; /*! 设置SCK空闲时极性,空闲时SCK为高*/
- spiConfig.frmSize = SPI_FRAME_SIZE_8BITS;
- spiConfig.rxMsbFirstEn = ENABLE; /*! 选择从最高位开始接收*/
- spiConfig.txMsbFirstEn = ENABLE; /*! 选择从最高位开始发送*/
- spiConfig.csOutputEn = ENABLE; /*! CS由SPI硬件控制*/
- spiConfig.continuousCSEn = ENABLE; /*! 片选连续模式*/
- spiConfig.modeFaultEn = DISABLE; /*! 模式故障禁止*/
- spiConfig.wakeUpEn = DISABLE; /*! 主机模式不支持唤醒功能*/
- spiConfig.spiEn = ENABLE;
- spiConfig.callBack = SPI0_Callback;
- spiConfig.interruptEn = ENABLE; /*! 使能NVIC中断*/
- spiConfig.txUFInterruptEn = ENABLE; /*! 打开TXUF中断,可禁止*/
- spiConfig.rxOFInterruptEn = ENABLE; /*! 打开RXOF中断,可禁止*/
- spiConfig.modeFaultInterruptEn = DISABLE; /*! 关闭模式故障中断*/
- SPI_Init(SPI0, &spiConfig);
- }
- /*!
- * [url=home.php?mod=space&uid=247401]@brief[/url] SPI TransmitReceivePoll Test
- *
- * @param none
- * [url=home.php?mod=space&uid=266161]@return[/url] none
- */
- void SPI_MasterTransmitReceivePolling(void)
- {
- while (g_spiTxBuff[0] == g_spiTxBuff[1]) /*! 等待按键按下*/
- {
- ;
- }
- g_spiTxBuff[0]++;
- SPI_TransmitReceivePoll(SPI0, g_spiRxBuff, g_spiTxBuff, DATA_SIZE);
- g_spiTxBuff[1] = g_spiTxBuff[0];
- }
|