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.

[参考译文] CCS/LAUNCHXL-F28379D:两个 f28379D LaunchPad 之间的 SPI 通信

Guru**** 2524930 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/887718/ccs-launchxl-f28379d-spi-communication-between-two-f28379d-launchpads

器件型号:LAUNCHXL-F28379D

工具/软件:Code Composer Studio

尊敬的所有人:

你好

我是 CCS 领域的初学者、我需要有关我正在执行的项目的帮助。 问题是、我正在尝试从一个 F28379d Launchpad 向第二个 LaunchPad 发送一个特定值(例如 ADC 值)。 我的目的是将值从主器件发送到从器件。

我已经在论坛上完成了许多示例(SPI_loopback、SPI_ex3_externallobak 等)和不同的讨论。 但这让我更加困惑。

因此、我从"SPI_loopback"示例开始。 我想将值1 (就像一个常量示例一样)从主器件发送到从器件。

对于主器件、我有以下代码:

 sdata = 1;

for (;;)

//发送数据
SPI_xmit (sdata);

*********

void SPI_init()

SpiaRegs.SPICCR.all =0x000F;//复位打开、上升沿、16位字符位
SpiaRegs.SPICTL.ALL =0x0006;//启用主控模式、正常相位、
//启用 TALK、禁用 SPI int。
SpiaRegs.SPIBRR.ALL =0x007F;
SpiaRegs.SPICCR.all =0x009F;//从复位中撤回 SPI
SpiaRegs.SPIPRI.bit.FREE = 1;//设置断点以避免干扰 xmission

void SPI_xmit (uint16 A)

SpiaRegs.SPITXBUF=A;

void SPI_Fifo_init()

//初始化 SPI FIFO 寄存器
SpiaRegs.SPIFFTX.All=0xE040;
SpiaRegs.SPIFFRX.All=0x2044;
SpiaRegs.SPIFFCT.All=0x0;

GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;//启用 GPIO16上的上拉电阻器(SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;//启用 GPIO17上的上拉电阻器(SPISOMIA)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;//启用 GPIO18上的上拉电阻器(SPICLKA)
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;//启用 GPIO19上的上拉电阻器(SPISTEA)

GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//异步输入 GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//异步输入 GPIO17 (SPISOMIA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//异步输入 GPIO18 (SPICLKA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;//异步输入 GPIO19 (SPISTEA)

GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;//将 GPIO16配置为 SPISIMOA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;//将 GPIO17配置为 SPISOMIA
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;//将 GPIO18配置为 SPICLKA
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3;//将 GPIO19配置为 SPISTEA

GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//将 GPIO16配置为 SPISIMOA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//将 GPIO17配置为 SPISOMIA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//将 GPIO18配置为 SPICLKA
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3;//将 GPIO19配置为 SPISTEA

对于从器件、我有以下代码:

RDATA = 0;

for (;;)

GPIO_WritePin (19、1);

RDATA = SpiaRegs.SPIRXBUF;

GPIO_WritePin (19、0);

小部分

void SPI_init()

SpiaRegs.SPICCR.all =0x000F;//复位打开、上升沿、16位字符位
SpiaRegs.SPICTL.ALL =0x0006;//启用主控模式、正常相位、
//启用 TALK、禁用 SPI int。
SpiaRegs.SPIBRR.ALL =0x007F;
SpiaRegs.SPICCR.all =0x009F;//从复位中撤回 SPI
SpiaRegs.SPIPRI.bit.FREE = 1;//设置断点不会干扰
// xmission

void SPI_Fifo_init()


SpiaRegs.SPIFFRX.bit.RXFFIL = 0x00;// 4:0中断级别
SpiaRegs.SPIFFRX.bit.RXFFIENA =0;// 5中断使能0
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;// 6清除 INT 标志
SpiaRegs.SPIFFRX.bit.RXFFINT = 0;// 7 INT 标志
SpiaRegs.SPIFFRX.bit.RXFFST = 0;// 12:8 FIFO 状态
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;// 13 FIFO 复位
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 0;// 14清除溢出
SpiaRegs.SPIFFRX.bit.RXFFOVF = 0;// 15 FIFO 溢出
SpiaRegs.SPIFFCT.All=0x0;

//在配置更改之前将 RESET 设置为低电平
//时钟极性(0 =上升、1 =下降)
// 16位字符
//启用环回

SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICCR.bit.SPICHAR =(16-1);
SpiaRegs.SPICCR.bit.SPILBK = 1;

//启用主设备(0 =从设备,1 =主设备)
//启用传输(TALK)
//时钟相位(0 =正常、1 =延迟)
//禁用 SPI 中断

SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPICTL.bit.SPIINTENA=0;

SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;

SpiaRegs.SPIPRI.bit.FREE = 1;

//解除 SPI 复位
SpiaRegs.SPICCR.bit.SPISWRESET = 1;

GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;//启用 GPIO16上的上拉电阻器(SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;//启用 GPIO17上的上拉电阻器(SPISOMIA)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;//启用 GPIO18上的上拉电阻器(SPICLKA)
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;//启用 GPIO19上的上拉电阻器(SPISTEA)

GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//异步输入 GPIO16 (SPISIMOA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//异步输入 GPIO17 (SPISOMIA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//异步输入 GPIO18 (SPICLKA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;//异步输入 GPIO19 (SPISTEA)

GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;//将 GPIO16配置为 SPISIMOA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;//将 GPIO17配置为 SPISOMIA
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;//将 GPIO18配置为 SPICLKA
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3;//将 GPIO19配置为 SPISTEA

GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//将 GPIO16配置为 SPISIMOA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//将 GPIO17配置为 SPISOMIA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//将 GPIO18配置为 SPICLKA
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3;//将 GPIO19配置为 SPISTEA

(第5颗星

问题是、一旦我将 SPICTL.bit.MASTER_SLAVE 从0更改为1 (作为主器件工作)、我就可以看到一切正常(当然、两个微器件都作为主器件)。

但是、一旦第二个微控制器在从模式下运行、它就会卡在 GPIO_WritePin (19、1)上。  

如果您能帮我解决问题、我将不胜感激。

此致、

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

    SPI 主器件和 SPI 从器件代码上都有一些不正确的配置。我总结了这些配置、这对于在代码中进行更正非常有用。

    主模式代码的关键更改

       -禁用环回模式。 此模式仅用于测试目的、对于独立模式(无需另一个 SPI 从器件)下的 SPI 测试而言非常有用。
          SpiaRegs.SPICCR.all =0x008F;

       看起来您好像没有使用 SPI FIFO。 因此、请确保禁用 FIFO
          SpiaRegs.SPIFFTX.bit.SPIFFENA=0;

       -启用 SPIINTENA 以在 SPI 传输完成时生成 INT_FLAG 位
          SpiaRegs.SPICTL.bit.SPIINTENA=1;
          
       -根据您的代码,您已正确地将 SPI 配置为主发送器模式
          SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//主模式
          SpiaRegs.SPICTL.bit.TALK        = 1;//Trasnmit 模式被启用
       
       -更改无限循环外观,如下所示
          for (;;)
          {
             //发送数据
             SPI_xmit (sdata);
             while (!SpiaRegs.SPISTS.INT_FLAG);//等待 SPI 完成传输
          }

    对从模式代码的关键更改
       
       -禁用环回模式。 此模式仅用于测试目的、对于独立模式(无需另一个 SPI 从器件)下的 SPI 测试而言非常有用。
          SpiaRegs.SPICCR.all =0x008F;
       
       -确保将从设备配置为从接收器,如下所示
          SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;//从模式
          SpiaRegs.SPICTL.bit.TALK                  = 0;//接收器模式被启用
          
       看起来您好像没有使用 SPI FIFO。 因此、请确保禁用 FIFO
          SpiaRegs.SPIFFTX.bit.SPIFFENA=0      ;//禁用 SPI FIFO
          SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0;//将 SPI RX FIFO 保持在复位状态

       -启用 SPIINTENA 以在 SPI 传输完成时生成 INT_FLAG 位
          SpiaRegs.SPICTL.bit.SPIINTENA=1;
          
       -我不了解您的 SPI 从设备示例代码中 GPIO19的作用。
       
       -等待 INT_FLAG 指示 SPI 已接收信息
       
          while (!SpiaRegs.SPISTS.INT_FLAG);
          RDATA = SpiaRegs.SPIRXBUF;

    此致、

    曼诺伊

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

    尊敬的 Manoj:

    非常感谢您的帮助。 我已经仔细听取了你的意见。

    我的代码中似乎仍然存在问题。 不幸的是、我无法理解它是来自主器件侧还是从器件侧。

    秘书长的报告

    主器件:

      sdata = 1;
      for (;;)
      {    
        //发送数据
        SPI_xmit (sdata);
        while (!SpiaRegs.SPISTS.bit.INT_FLAG);//等待 SPI 完成传输
      }


    空错误(空)

       asm ("    ESTOP0");                   //测试失败!! 停下来!
       适用于(;);


    void SPI_init()
    {    

       SpiaRegs.SPIBRR.ALL =0x007F;
       SpiaRegs.SPIPRI.bit.FREE = 1;               //设置断点以避免干扰 xmission

           //在配置更改之前将 RESET 设置为低电平
           //时钟极性(0 =上升、1 =下降)
           // 16位字符
           //启用环回
           SpiaRegs.SPICCR.bit.SPISWRESET = 0;
           SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
           SpiaRegs.SPICCR.bit.SPICHAR =(16-1);
           SpiaRegs.SPICCR.bit.SPILBK = 0;

           SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
           SpiaRegs.SPICTL.bit.TALK = 1;
           SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
           SpiaRegs.SPICTL.bit.SPIINTENA=1;//启用 SPIINTENA 以在 SPI 传输完成时生成 INT_FLAG 位



    void SPI_xmit (uint16 A)

       SpiaRegs.SPITXBUF=A;


    void SPI_Fifo_init()                               


       SpiaRegs.SPIFFTX.bit.SPIFFENA=0;
    }  

    从属方:

     for (;;)
      {

           while (!SpiaRegs.SPISTS.bit.INT_flag);
          RDATA = SpiaRegs.SPIRXBUF;
      }

    void SPI_init()


           SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;
           SpiaRegs.SPICTL.bit.TALK = 0;//接收器模式被启用
           SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
           SpiaRegs.SPICTL.bit.SPIINTENA=1;

           //在配置更改之前将 RESET 设置为低电平
           //时钟极性(0 =上升、1 =下降)
           // 16位字符
           //启用环回
           SpiaRegs.SPICCR.bit.SPISWRESET = 0;
           SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
           SpiaRegs.SPICCR.bit.SPICHAR =(16-1);
           SpiaRegs.SPICCR.bit.SPILBK = 0;

           SpiaRegs.SPIBRR.ALL =0x007F;
           SpiaRegs.SPIPRI.bit.FREE = 1;   //设置断点不会干扰



    //
    // SPI_Fifo_init -初始化 SPI FIFO 寄存器
    //
    void SPI_Fifo_init()

    //   SpiaRegs.SPIFFTX.ALL = 0xE040;
    //   SpiaRegs.SPIFFRX.ALL = 0x2044;
    //   SpiaRegs.SPIFFCT.all = 0x0;
       SpiaRegs.SPIFFRX.bit.RXFFIL = 0x00;                     // 4:0   中断级别
       SpiaRegs.SPIFFRX.bit.RXFFIENA =0;                       // 5     中断使能0
       SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 0;                    // 6     清除 INT 标志
       SpiaRegs.SPIFFRX.bit.RXFFINT = 0;                       // 7     INT 标志
       SpiaRegs.SPIFFRX.bit.RXFFST = 0;                        // 12:8  FIFO 状态
       SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0;                   // 13    FIFO 复位
       SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 0;                    // 14    清除溢出
       SpiaRegs.SPIFFRX.bit.RXFFOVF = 0;                       // 15    FIFO 溢出

       SpiaRegs.SPIFFCT.All=0x0;

    (小部分

    在我看来、程序会一直处于"while (!SpiaRegs.SPISTS.bit.INT_flag)"状态。

    请告诉我问题在哪里?

    此致、

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

    您似乎忘记了设置 SpiaRegs.SPICCR.bit.SPISWRESET = 1。 除非您设置 SPISWRESET =1、否则 SPI 既不发送(或)也不接收。 发送器侧和接收器侧都存在此问题。

    我建议探测示波器信号以查看 SPI 是否正在传输。

    此致、

    曼诺伊

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

    谢谢你,Monaj。 它现在可以工作了!!!