主题中讨论的其他器件: HALCOGEN
工具/软件:
我使用了两个使用 TMS570LS1224微控制器的 LaunchPad 开发板。 一个电路板配置为 SPI 主器件 、另一个作为 SPI 从器件 。
我需要使用 SPI 接收中断 亮起 两者可兼得 通过 SPI 接收数据字节时的主侧和从侧。 两个电路板均使用进行连接 SPI3 。
在上 主板 、当我使用以下函数时、中断工作正常:
spiEnableLoopback(spiREG3, Digital_Lbk);
在这种情况下、中断会正确触发、并且 LED 会连接到 PORTB GIO 引脚2 亮起。
但是、当我为应用必要的配置时 从器件 要处理接收中断(而不是环回)、 不触发中断 发送数据时出现错误的数据。
注意:我已经排除了布线问题、因为从机 使用轮询模式正确接收数据 。 该问题似乎特定于在从器件侧使用中断。
您能帮我弄清楚为什么会出现 SPI RX 中断在从器件上不起作用 当连接到主器件时、即使它在环回模式下工作?
我在下面附上了主设备和从设备的 CCS 代码和 HALCoGen 设置。
主代码 CSS
/*用户代码开头(0)*/
#include "sci.h"
#include "Gio.h"
#include "string.h"
#include "stdio.h"
包含"stdlib.h"
包含"spi.h"
/*用户代码结束*/
/*包含文件*/
#include "sys_common.h"
/*用户代码开头(1)*/
//全局变量
uint16 Tx_SPI[1]={0x00};// SPI 发送缓冲器
uint16 rx_spi[1]={0x00};// SPI 接收缓冲器
spiDAT1_t 数据配置1_t;
unsigned char SCI[4]={ 0 };//用于存储来自 Command_String 的命令字符串的缓冲区
//用于保存从 SCI 接收到的命令的变量
unsigned char 命令;
//用于命令处理的变量
uint16_t 索引= 0;//命令字符串缓冲区索引
uint16_t FLAG = 0;//表示数据已准备好通过 SPI 发送的标志
/*用户代码结束*/
/**@fn void main (void)
*@简短的应用程序主函数
*@请注意,此函数默认为空。
*
*此函数在启动后调用。
*用户可以使用此功能来实现应用程序。
*/
/*用户代码开头(2)*/
/*用户代码结束*/
内部 main (void)
{
/*用户代码开头(3)*/
gioInit();
sciInit();
spiInit();
_enable_irq();
// SPI 配置:使用 SPI3且芯片选择= 1
dataconfig1_t.CS_HOLD = true;
dataconfig1_t.WDEL = true;
dataconfig1_t.DFSEL = SPI_FMT_0;
dataconfig1_t.csnr = SPI_CS_1;
gioSetBit(gioPORTB, 1, 0);
spiREG3->INT0 |=(1U << 8);//启用 SPI 接收中断
spiEnableNotification (spiREG3、spiREG3->INT0);//启用 SPI RX 中断通知
sciReceive (scilinREG、1、(无符号字符*)&command);
spiGetData (spiREG3、&dataconfig1_t、1、rx_spi);
//使用环回模式测试回路
//spiEnableLoopback (spiREG3、Digital_Lbk);
while (1)
{
if (flag == 1){
//spiTransmitAndReceiveData (spiREG3、&dataconfig1_t、1、TX_SPI、rx_SPI);
//spiTransmitData (spiREG3、&dataconfig1_t、1、Tx_SPI);
spiSendData (spiREG3、&dataconfig1_t、1、Tx_SPI);
标志= 0;
}
}
/*用户代码结束*/
返回0;
}
/*用户代码开头(4)*/
void sciNotification (scibase_t *sci、Uint32标志)
{
uint16_t 缓冲器;
sciReceive (scilinREG、1、(无符号字符*)&command);
if (命令!='?')
{
Command_String [索引]=命令;
++索引;
}
暴露
{
//何时"?" 将命令字符串转换为数字
buffer =(uint16_t) atoi ((const char*) Command_String);
TX_SPI[0]=缓冲器;//将转换后的值分配给 SPI 发送缓冲器
INDEX = 0;//重置命令字符串索引
Command_String [0]='\0';//清除字符串
FLAG = 1;//设置标志以触发 SPI 传输
}
}
void spiEndNotification (spiBASE-t *SPI)
{
spiGetData (spiREG3、&dataconfig1_t、1、rx_spi);
gioSetBit(gioPORTB, 1, 1);
if (RX_SPI[0]== 125){
gioSetBit(gioPORTB, 1, 1);
}其他{
gioSetBit(gioPORTB, 1, 0);
}
}
/*用户代码结束*/
Halcogen Master
从设备的代码
内部 main (void)
{
/*用户代码开头(3)*/
gioInit();
sciInit();
spiInit();
_enable_irq();
// SPI 配置:使用 SPI3且芯片选择= 1
dataconfig1_t.CS_HOLD = true;
dataconfig1_t.WDEL = true;
dataconfig1_t.DFSEL = SPI_FMT_0;
dataconfig1_t.csnr = SPI_CS_1;
gioSetBit(gioPORTB, 1, 0);
spiREG3->INT0 |=(1U << 8);//启用 SPI 接收中断
spiEnableNotification (spiREG3、spiREG3->INT0);//启用 SPI RX 中断通知
spiGetData (spiREG3、&dataconfig1_t、1、rx_spi);
//使用环回模式测试回路
//spiEnableLoopback (spiREG3、Digital_Lbk);
while (1)
{
}
/*用户代码结束*/
返回0;
}
/*用户代码开头(4)*/
void spiEndNotification (spiBASE-t *SPI)
{
spiGetData (spiREG3、&dataconfig1_t、1、rx_spi);
gioSetBit(gioPORTB, 1, 1);
if (RX_SPI[0]== 125){
gioSetBit(gioPORTB, 1, 1);
}其他{
gioSetBit(gioPORTB, 1, 0);
}
}
/*用户代码结束*/
Halcgen 从器件
THX
Ariel