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.

[参考译文] TMS320F28335:使用 SPI 从 TMS320F28335作为主器件、使用 TMS320F28335作为从器件(2个电路板1个电路板作为主器件1个电路板作为从器件)进行传输

Guru**** 2550850 points
Other Parts Discussed in Thread: TMS320F28335, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1251579/tms320f28335-transmission-with-spi-from-tms320f28335-as-master-and-tms320f28335-as-slave-2-boards-1-as-master-1-as-slave

器件型号:TMS320F28335
主题中讨论的其他器件: C2000WARE

您好!  

   我正在尝试通过 SPI 将数据从主设备传输到从设备。 主从均为 TMS320F28335、但有2个差分板。 在进行传输时、我无法接收数据。 它从 TXBUF 发送到数据寄存器、但在该 RXBUF 之后没有接收数据。 有人能帮助我吗?  

该主模式  

#include "Mcu1_Device.h"// DSP2833x 头文件包含文件
#include "Mcu1_spi.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"

//
// InitSPI -此函数将 SPI 初始化为已知状态。
//


UNS16数据= 0x5555;
UNS16 receivedData;//=0;
UNS16 transdata =0、Dataregister = 0;

空 InitSpi (空)
{
//
//初始化 SPI-A/B/C/D
//

//
// InitSpiGpio -该函数初始化 GPIO 引脚以用作 SPI 引脚
//
//每个 GPIO 引脚都可以配置为一个 GPIO 引脚,或者配置为3个不同的
//外设功能引脚。 默认情况下、所有引脚都作为 GPIO 出现、
//复位后输入。
//
//注意:
//针对每个 SPI 外设
//只应启用一个 GPIO 引脚进行 SPISOMO 操作。
//只应启用一个 GPIO 引脚来进行 SPISOMI 操作。
//只应启用一个 GPIO 引脚来运行 SPICLKA。
//对于 SPISTEA 操作,只应启用一个 GPIO 引脚。
//注释掉其他不需要的行。
//
void InitSpiGpio()
{
InitSpiaGpio();

//
// InitSpiaGpio -此函数初始化 GPIO 点以用作 SPI 引脚
//
void InitSpiaGpio()
{
EALLOW;

//
//启用所选引脚的内部上拉
//上拉可由用户启用或禁用。
//这将启用指定引脚的上拉。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 1;//启用 GPIO16上的上拉(SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 1;//启用 GPIO17上的上拉(SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 1;//启用 GPIO18上的上拉(SPICLKA)
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 1;//启用 GPIO19上的上拉(SPISTEA)

// GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;//启用 GPIO54上的上拉(SPISIMOA)
// GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;//启用 GPIO55上的上拉(SPISOMIA)
// GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;//启用 GPIO56上的上拉(SPICLKA)
// GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0;//启用 GPIO57上的上拉(SPISTEA)

//
//将所选引脚的鉴定设置为仅异步
//这将为所选的引脚选择异步(无限定条件)。
//注释掉其他不需要的行。
//
 GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3;//异步输入 GPIO16 (SPISIMOA)
 GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;//异步输入 GPIO17 (SPISOMIA)
 GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;//异步输入 GPIO18 (SPICLKA)
 GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;//异步输入 GPIO19 (SPISTEA)

//GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3;//异步输入 GPIO16 (SPISIMOA)
//GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3;//异步输入 GPIO17 (SPISOMIA)
//GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3;//异步输入 GPIO18 (SPICLKA)
//GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3;//异步输入 GPIO19 (SPISTEA)

//
//使用 GPIO 寄存器配置 SPI-A 引脚
//这指定了可能的 GPIO 引脚中的哪一个是 SPI
//功能引脚。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1;//将 GPIO16配置为 SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;//将 GPIO17配置为 SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;//将 GPIO18配置为 SPICLKA
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;//将 GPIO19配置为 SPISTEA

// GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1;//将 GPIO54配置为 SPISIMOA
// GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1;//将 GPIO55配置为 SPISOMIA
// GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1;//将 GPIO56配置为 SPICLKA
// GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1;//将 GPIO57配置为 SPISTEA

EDIS;

void init_spi ()//function for config GPIO 和 SCI 模块
{

EALLOW;
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;//启用外设时钟
EDIS;

//配置 SPI 模块


SpiaRegs.SPICCR.all = 0x002F;
// SpiaRegs.SPICTL.bit.SPIINTENA =1;
SpiaRegs.SPICTL.bit.talk = 1;//作为主模式、 需要通话
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//作为主模式,使其为1
SpiaRegs.SPIBRR = BRR;
SpiaRegs.SPIFFTX.bit.TXFFIL = 2;//8;
SpiaRegs.SPIFFTX.bit.TXFFIENA = 1;
SpiaRegs.SPIFFTX.bit.TXFIFO = 1;
SpiaRegs.SPIFFTX.bit.SPIFFENA = 1;
SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;

// SpiaRegs.SPIFFRX.ALL = 0x2062;//8;

EALLOW;
//配置中断
PieVectTable.SPITXINTA =&SPI_TX_ISR;//将 ISR 分配给 SCI TX 中断
// PieVectTable.SPIRXINTA =&SPI_RX_ISR;//将 ISR 分配给 SCI RX 中断
//外设初始化
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
pieCtrlRegs.PIEIER6.bit.intx2 = 1;//此处在 PIE 组中启用 SCI RX 中断9 //429 intr
PieCtrlRegs.PIEIER6.bit.INTx1 = 1;//此处启用 PIE 组中的 SCI TX 中断9

//这是禁用对 EALLOW 保护寄存器的写入所必需的
EDIS;
// IER |= 0x0020;//或 M_INT6;
EINT;//启用中断
ERTM;//启用全局实时中断 DBGM

printf ("传输\n");


void SPI_TX (void)
{
// if (SpiaRegs.SPISTS.bit.INT_flag!= 1)//检查 TX 已为数据做好准备
if (SpiaRegs.SPIFFTX.bit.TXFFST == 0)//TX 为空且为新数据做好准备
{
printf ("ready to transfer\n");//打印 TX 状态
SpiaRegs.SPITXBUF =数据;

//}//通过 SCI-A 发送数据

否则
{
printf ("发送器未就绪");

transdata = SpiaRegs.SPITXBUF;//读取从 SCITXBUF 传输的数据
printf ("发送器数据:0x%X\n"、transdata);

Dataregister= SpiaRegs.SPIDAT;
printf ("寄存器中的数据是:0x%X\n"、Dataregister);


}  


用于发送中断的//ISR
中断失效 SPI_TX_ISR ()
{
//清除中断标志
SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;
//确认该中断以接收来自组9的更多中断
PieCtrlRegs.PIEACK.all |= PIEACK_group6;

这是从模式  

void init_spi ()//function for config GPIO 和 SCI 模块
{

EALLOW;
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;//启用外设时钟
EDIS;

//配置 SPI 模块


SpiaRegs.SPICCR.all = 0x002F;
// SpiaRegs.SPICTL.bit.SPIINTENA =1;
SpiaRegs.SPICTL.bit.talk = 0;//作为受控模式、无需通话
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;//作为从模式使其为0
SpiaRegs.SPIBRR = BRR;

SpiaRegs.SPIFFRX.all = 0x2062;  //8;

EALLOW;
//配置中断

PieVectTable.SPIRXINTA =&SPI_RX_ISR;//将 ISR 分配给 SCI RX 中断
//外设初始化
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
pieCtrlRegs.PIEIER6.bit.intx2 = 1;//此处在 PIE 组中启用 SCI RX 中断9 //429 intr
// PieCtrlRegs.PIEIER6.bit.INTx1 = 1;//此处启用 PIE 组9中的 SCI TX 中断

//这是禁用对 EALLOW 保护寄存器的写入所必需的
EDIS;
// IER |= 0x0020;//或 M_INT6;
EINT;//启用中断
ERTM;//启用全局实时中断 DBGM

printf ("传输\n");

void SPI_Rx (void)
{


UNS16 START_TIME = CLOCK ();
printf("ready to receive\n");
receivedData = SpiaRegs.SPIRXBUF;//Anil //读取接收到的数据

printf ("receivedData:0x%X\n"、receivedData);

//ISR 用于接收中断
中断失效 SPI_RX_ISR ()
{
//清除溢出标志
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 1;
// SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 1;//清除溢出标志
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;//清除中断标志

//确认该中断以接收来自组9的更多中断
PieCtrlRegs.PIEACK.all |= PIEACK_group6;//确认中断以清除标志

在 main.c 中调用 TX 和 RX 函数并在 main.c 中全局提供数据  

此外、我还可以告诉我两个目标、我需要从哪个引脚连接到哪个引脚、例如 SIMO 到 SOMI 或 SIMO 到 SIMO 和 SOMI 到 SOMI。  是否连接了该 SPICLKA 引脚、它是否仅将 CLKA 连接至 CLKA?由于我只有一个从器件 、因此我需要将 SPISTEA 引脚从主器件连接至从器件。  

您能尽快帮我吗?  

谢谢。此致、
查亚  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    并请告诉我需要从哪个引脚连接到哪个引脚、例如 SIMO 到 SOMI 或 SIMO 到 SIMO 和 SOMI 到 SOMI。  是否连接了该 SPICLKA 引脚、它是否仅将 CLKA 连接至 CLKA?由于我只有一个从器件 、因此我需要将 SPISTEA 引脚从主器件连接至从器件。  [/报价]

    如果您不清楚这一点、则可能是您未收到数据的原因。  

    SIMO (从器件输入、主器件输出)将连接到 SOMI (从器件输出、主器件输入)

    SIMO (从器件输入、主器件输出)将连接到 SIMO

    SOMI (从器件输出、主器件输入)将被连接至 SOMI

    CLKS 会相互连接。

    SPISTE 引脚会连接在一起。  

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

    您好!  

    感谢您的答复。  

    这意味着我不应该只将 SIMO 连接到 SOMI? 我的理解是否正确?  

    我只需要像 SIMO 连接到 SIMO。 CLK 接地。  

    但在手册中、它们像 CLK 一样给出、仅在另一个目标中连接 CLK。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这意味着我不应该只将 SIMO 连接到 SOMI? 我的理解是否正确?  [/报价]

    抱歉、我在上一次回复中犯了一个错误。 应将 SOMI 连接到 SOMI、将 SIMO 连接到 SIMO。 我在之前的回复中对此进行了编辑。 SPICLK 引脚相互连接。

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

    您好!

    我曾尝试这样连接引脚、只是现在我还无法接收数据。 但在 TXBUF 和 DATA 寄存器中我可以看到数据。  

    我尝试通过示波器查看时钟和 MOSI 的波形、以确保不发生传输的位置。 即使在这种情况下、我们也无法看到波形。  

    我尝试将引脚 SIMO 连接到 SIMO、SOMI 连接到 SOMI、CLK 连接到 CLK、STE 接地(使其变为低电平)  

    我在两个单独的系统中执行类似的操作、例如一个具有主代码、一个具有将它们连接到 TMS320F28335 (2个目标)并连接 GPIO 引脚的从代码。  

    请帮我解决这个问题。  

    谢谢。此致、

    查亚  

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

    我想问一下、为什么您会选择 STE 接地? 这将使 SPI 接口始终处于工作状态、从而容易受到噪声的影响。 最好由主器件驱动从器件上的 STE。  

    我尝试使用示波器查看时钟和 MOSI 的波形,以确保没有发生传输的位置。 即使在这种情况下、我们也无法看到波形。  [/报价]

    SPI 看起来处于复位状态。 SPISWRESET 需要为1才能使 SPI 运行。 您还设置了保留位。  

    SpiaRegs.SPICCR.all = 0x002F;

    您还可以在主器件上尝试此示例:

    C:\ti\c2000\c2000Ware_5_00_00\device_support\F2833x\examples\spi_loopback

    默认情况下、该示例将在环回模式下运行。 您需要修改下面的行以禁用环回并查看引脚活动。

    回送:

    SpiaRegs.SPICCR.all =0x009F;

    无回送:

    SpiaRegs.SPICCR.all = 0x008F;

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

    您好!  

    非常感谢您的帮助。  

    我将 STE 接地、因为在文档中他们提到 "一个激活的 SPISTE 将不允许从器件接收数据。" (在第9.2.1节中)。  

    因此、我尝试了接地。  

    现在、我已经启用了复位位。  

    现在、当我尝试使用回送时、数据正在发送和接收。 通过硬件连接、我还可以传输数据。  

    非常感谢

    谢谢。此致、

    查亚  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正将 STE 接地,因为在文档中他们提到如下 "一个激活的 SPISTE 将不允许从器件接收数据。" (在第9.2.1节中)。  [/报价]

    这是正确的、但是、您通常只能在 SPI 事务期间激活 SPISTE。 如果您始终将 SPISTE 保持接地、则 SPI 从器件将始终侦听数据。 这样做并非总是可取的。