This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LS1224:SPI3 RX 中断在环回中工作、但在连接到从器件时不工作(TMS570LS1224)

Guru**** 2380860 points
Other Parts Discussed in Thread: TMS570LS1224, HALCOGEN
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1497484/tms570ls1224-spi3-rx-interrupt-works-in-loopback-but-not-when-connected-to-slave-tms570ls1224

器件型号:TMS570LS1224
主题中讨论的其他器件: 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ariel:

    我在以下线程中附加了一个 SPI 中断项目:

    (+) LAUNCHXL2-RM46:SPI 环回测试有效、但 SPI1 (主器件)至 SPI3 (从器件)测试不有效-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    您能看一下这个示例并将其与您的示例进行比较吗?

    --

    此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jagadish:

    感谢您提供示例项目、它非常有助于作为解决问题的参考和指南。 根据您的代码和说明、我成功地使用两个 TMS570LS12x LaunchPad 之间的中断来实现 SPI 通信。
    下面、我分享了我使用的解决方案、以防它有助于其他人从事类似设置。

    在两个 LaunchPad 之间 使用中断进行 SPI 通信 TMS570LS12xx (SPI3主器件和 SPI1从器件)

    设置:

    • 电路板1: 使用SPI3如所示 主站

    • 电路板2: 使用SPI1如所示 从器件

    • 从 HMI 通过 SCI 接收到命令后、从主器件发送 SPI 数据。

    • 通信在轮询模式下工作、但切换到 基于中断 SPI 需要进行一些重要调整。

    HALCoGen 配置中的更改(主器件侧- SPI3)

    为了使 SPI 主器件(电路板1)与在中断模式下工作的 SPI 从器件兼容:

    1. SPI3→数据格式0→WDELAY= 3

      • 这将设置芯片选择置为有效后的延迟、为从器件提供准备就绪时间。

      • 当从器件使用基于中断的接收时、对同步至关重要。

    代码中的更改(从器件侧- SPI1)

    在基于中断的实现中、以下方面至关重要

    2 英寸main()(从器件- SPI1)
    调用 spiGetData()解决方案 传输开始:

    spiGetData (spiREG1、&dataconfig1_t、1、rx_spi);

    这将初始化接收缓冲区、并允许从器件在主器件开始计时时进行响应

    中断处理程序中的3 spiEndNotification()
    spiGetData()在处理程序内将相同的调用添加到 重新布防 接待处:

    void spiEndNotification (spiBASE-t *SPI)

    spiGetData (spiREG1、&dataconfig1_t、1、rx_spi);  

    IF (RX_SPI[0]= 125)
    gioSetBit(gioPORTB, 1, 1);
    暴露
    gioSetBit(gioPORTB, 1, 0);
    }

    结果

    通过这些更改:

    • 从器件正确接收主器件发送的 SPI 数据。

    • 通信可靠、由中断驱动。

    • gioSetBit()切换可通过 LED 轻松进行调试。