"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

