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 通信

Guru**** 2539500 points
Other Parts Discussed in Thread: TMS320F28335, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/610969/tms320f28335-spi-communication

器件型号:TMS320F28335
Thread 中讨论的其他器件: controlSUITE

大家好、

我正在与 TMS320F28335、C2000系列进行 SPI 通信。 我想在 SPI 协议上进行控制器到控制器的通信(主从配置)。

如果我获得控制器到控制器 SPI 通信(主从配置)的示例程序、将会有所帮助。

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

    您可以参考 SPI_loopback/interrupt 示例、禁用环回功能并使用相同的功能。
    C:\ti\controlSUITE\device_support\F2833x\v142\DSP2833x_examples_ccsv5

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

    您好 Prakash、

    我同意 Gautam 的说法。

    如果尚未下载 ControlSuite、您可以从 http://www.ti.com/tool/CONTROLSUITE?keyMatch=controlSUITE&tisearch=Search-EN-Everything 下载

    谢谢、

    Marlyn

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Gautam、
    感谢您的建议。
    我已经尝试通过将回送概念更改为主从来使用该示例程序。
    实际上、我希望通过芯片选择配置将主器件与从器件通信。 在配置与主器件和从器件的通信时、从器件不会读取数据。

    如果没有芯片选择、我将通过主器件向从器件提供持续变化的数据。 从器件提供随机数据。

    这是我的主代码

    void main (void)


    uint16 i;
    InitSysCtrl();
    InitSpiaGpio();
    Dint;
    IER = 0x0000;
    IFR = 0x0000;
    InitPieCtrl();
    InitPieVectTable();

    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
    PieVectTable.SPIRXINTA =&spiRxFifoIsr;
    PieVectTable.SPITXINTA =&spTxFifoIsr;
    EDIS;//这是禁止写入受保护的 EALLOW 所必需的

    SPI_Fifo_init();//仅初始化 SPI
    //初始化发送数据缓冲区
    for (i=0;i<8;i++)

    sdata[i]= i;

    RDATA_POINT = 0;

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
    PieCtrlRegs.PIEIER6.bit.INTx1=1; //启用 PIE 组6、INT 1
    PieCtrlRegs.PIEIER6.bit.INTx2=1; //启用 PIE 组6、INT 2
    IER = 0x0021; //启用 CPU INT6
    EINT; //启用全局中断


    void SPI_Fifo_init()

    //初始化 SPI FIFO 寄存器
    SpiaRegs.SPICCR.bit.SPISWRESET=0;//重置 SPI
    SpiaRegs.SPICCR.All=0x000F; //16位字符、环回模式
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;// 1 =上的数据传输
    SpiaRegs.SPICTL.All=0x0017; //中断被启用、主/从
    SpiaRegs.SPISTS.All=0x0000;
    SpiaRegs.SPIBRR=0x0063; //波特率
    SpiaRegs.SPIFFTX.All=0xC020; //启用 FIFO,设置 TX FIFO 级别
    SpiaRegs.SPIFFRX.All=0x0028; //将 RX FIFO 水平设置为8
    SpiaRegs.SPIFFCT.All=0x0000;
    // SpiaRegs.SPIFFCT.bit.TXDLY=6;
    SpiaRegs.SPIPRI.All=0x0010;
    SpiaRegs.SPICCR.bit.SPISWRESET=1;//启用 SPI
    SpiaRegs.SPIFFTX.bit.TXFIFO=1;
    SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;


    _interrupt void spiTxFifoIsr (void)

    uint16 i;
    for (i=0;i<8;i++)

    SpiaRegs.SPITXBUF=sdata[i]; //发送数据


    for (i=0;i<8;i++) //递增下一个周期的数据

    sdata[i]= sdata[i]+ 1;

    SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;//清除中断标志
    PieCtrlRegs.PIEACX.All|=0x20;//发出 PIE ACK


    _interrupt void spiRxFifoIsr (void)

    uint16 i;

    for (i=0;i<8;i++)

    RDATA[I]=SpiaRegs.SPIRXBUF;//读取数据

    for (i=0;i<8;i++) //检查接收到的数据

    if (RDATA[i]!= RDATA_POIN+I);//错误();

    RDATA_POIN++;
    SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;//清除溢出标志
    SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;//清除中断标志
    PieCtrlRegs.PIEACK.All|=0x20; //发出 PIE ACK


    这是我的从器件代码

    void main (void)



    InitSysCtrl();
    InitSpiaGpio();
    Dint;
    IER = 0x0000;
    IFR = 0x0000;

    InitPieCtrl();
    InitPieVectTable();

    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
    PieVectTable.SPIRXINTA =&spiRxFifoIsr;
    PieVectTable.SPITXINTA =&spTxFifoIsr;
    EDIS;//这是禁止写入受保护的 EALLOW 所必需的
    SPI_Fifo_init();//仅初始化 SPI
    RDATA_POINT = 0;

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
    PieCtrlRegs.PIEIER6.bit.INTx1=1; //启用 PIE 组6、INT 1
    PieCtrlRegs.PIEIER6.bit.INTx2=1; //启用 PIE 组6、INT 2
    IER = 0x0020; //启用 CPU INT6
    EINT; //启用全局中断

    void SPI_Fifo_init()

    //初始化 SPI FIFO 寄存器
    SpiaRegs.SPICCR.bit.SPISWRESET=0;//重置 SPI
    SpiaRegs.SPICCR.All=0x004F; //16位字符
    SpiaRegs.SPICTL.All=0x0012; //中断被启用、主/从
    SpiaRegs.SPISTS.All=0x0000;
    SpiaRegs.SPIBRR=0x0063; //波特率
    SpiaRegs.SPIFFTX.All=0xC028; //启用 FIFO,设置 TX FIFO 级别
    SpiaRegs.SPIFFRX.All=0x0028; //将 RX FIFO 水平设置为8
    SpiaRegs.SPIFFCT.All=0x0000;
    SpiaRegs.SPIPRI.All=0x0010;
    SpiaRegs.SPICCR.bit.SPISWRESET=1;//启用 SPI
    SpiaRegs.SPIFFTX.bit.TXFIFO=1;
    SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;


    _interrupt void spiTxFifoIsr (void)

    uint16 i;

    for (i=0;i<8;i++)

    SpiaRegs.SPITXBUF=sdata[i]; //发送数据


    for (i=0;i<8;i++) //递增下一个周期的数据

    sdata[i]= sdata[i]+ 1;

    SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;//清除中断标志
    PieCtrlRegs.PIEACX.All|=0x20;//发出 PIE ACK


    _interrupt void spiRxFifoIsr (void)

    uint16 i;

    for (i=0;i<8;i++)

    RDATA[I]=SpiaRegs.SPIRXBUF;//读取数据

    for (i=0;i<8;i++) //检查接收到的数据

    if (RDATA[i]!= RDATA_POIN+I);//错误();

    RDATA_POIN++;
    SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;//清除溢出标志
    SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;//清除中断标志
    PieCtrlRegs.PIEACK.All|=0x20; //发出 PIE ACK



    请告诉我需要纠正的地方。

    谢谢大家的问候