"Thread:SysConfig"中讨论的其他器件
您好!
我正在学习该 TI 微控制器的工作原理、在 尝试设置 SPI 通信时、我在理解 FIFO 功能如何工作时遇到问题。
我将连接 Launchpad 的2个 SPI 接口、并想使用 FIFO 中断从主器件(控制器)传输一个由8个 uint16_t 类型元素组成的数组(外设)。 我的配置和代码如下(我使用的是 SysConfig):
// Included Files /************************************************************************/ #include "driverlib.h" #include "device.h" #include "board.h" #include "c2000ware_libraries.h" /******************************************************************************************/ // Defines /*******************************************************************************/ /******************************************************************************************/ // Prototypes /****************************************************************************/ __interrupt void INT_mySPI0_TX_ISR(); __interrupt void INT_mySPI1_RX_ISR(); __interrupt void INT_mySPI0_RX_ISR(); __interrupt void INT_mySPI1_TX_ISR(); /******************************************************************************************/ // Global Variables /**********************************************************************/ uint16_t dim = 8; uint16_t rx_B[8]; uint16_t tx_A[8]; uint16_t tracker = 0; /******************************************************************************************/ // Main /**********************************************************************************/ void main(void) { // Local Variable uint16_t i; // Initialization of data for(i = 0; i < dim; i++) { tx_A[i] = i; rx_B[i]= 0; } // Initialize device clock and peripherals Device_init(); // Initialize PIE and clear PIE registers. Disables CPU interrupts. Interrupt_initModule(); // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). Interrupt_initVectorTable(); // PinMux and Peripheral Initialization Board_init(); // Enable Global Interrupt (INTM) and real time interrupt (DBGM) EINT; ERTM; // Infinite Loop while(1) { } } /******************************************************************************************/ // Interrupts /****************************************************************************/ __interrupt void INT_mySPI0_TX_ISR(){ // Local Variable uint16_t i; // TX for(i=0;i<dim;i++){ SPI_writeDataBlockingFIFO(mySPI0_BASE, tx_A[i]); } // Update Data for(i=0;i<dim;i++){ tx_A[i] += 1; } // Clear Interrupt SPI_clearInterruptStatus(mySPI0_BASE, SPI_INT_TXFF); Interrupt_clearACKGroup(INT_mySPI0_TX_INTERRUPT_ACK_GROUP); } __interrupt void INT_mySPI1_RX_ISR(){ // Local Variable uint16_t i; // TX for(i=0;i<dim;i++){ rx_B[i] = SPI_readDataBlockingFIFO(mySPI1_BASE); } // Check for(i=0;i<dim;i++){ if(rx_B[i] != (tracker + i)){ ESTOP0; } } // Update tracker tracker ++; // Clear Interrupt SPI_clearInterruptStatus(mySPI1_BASE, SPI_INT_RXFF); Interrupt_clearACKGroup(INT_mySPI1_RX_INTERRUPT_ACK_GROUP); } __interrupt void INT_mySPI1_TX_ISR(){ } __interrupt void INT_mySPI0_RX_ISR(){ } /******************************************************************************************/ // End of File
我希望代码已清除(在某种程度上遵循示例 spi_ex4 drivelib 示例)。 我将调用 TX ISR、在这里我使用命令 WriteDataBlockingFIFO 写入所有数据、然后在传输之后、通过缓冲器的每个元素进行更新。 然后在 RX ISR 中、我想读取我发送的所有数据(使用 ReadDataBlockingFIFO)并将其保存在与我发送的数据尺寸相同的数组中、然后我使用"tracker"变量检查我接收到的元素是否为预期的元素。
我设置的比特率为10MHz 是因为我还要为未来的项目实现快速通信。
(中断 ISR 的名称紧跟在最后一个镜像中的第一个名称之后)
我期望中断按如下方式触发:
-当 TX FIFO 中有8/16个位置被占用时、就会触发 TX ISR、因为我 将 SPI0 (控制器)"Transmitt Interrrupt Level"设置为"8/16 FIFO";
-当 RX FIFO 中的8/16个位置空闲时、就会触发 RX ISR、因为 我 将 SPI1 (外设)在"8/16 FIFO"上设置为"接收中断级别"。
当我调试时得到的结果是、在 RX ISR 生效时、只有 TX ISR 被触发。 我已经阅读了 SPI 的参考手册部分、但我不知道我的操作哪里有问题。 我附加了调试视图图片:
我不知道我是否误解了中断的调用方式、也不知道我在代码中使用的读取和写入函数、甚至只是协议的代码流。 您能帮助我理解我哪里出了问题以及 FIFO 缓冲区的工作原理吗?
提前感谢您 。
此致、
Edoardo