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/F28M36P63C2:在示波器上未观察到 SPI MOSI 引脚输出

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/700292/ccs-f28m36p63c2-spi-mosi-pin-output-not-observed-on-oscilloscope

器件型号:F28M36P63C2

工具/软件:Code Composer Studio

您好!

我正在尝试写入 SPI 传输函数、以将数据写入 Crystalfontz OFAL1602C OLED。 我无法在示波器的 MOSI 引脚上看到任何输出。 我能够在示波器上完美地观察从器件选择引脚和时钟、但没有 MOSI 输出。 请查看所附图片。

这就是我编写 SPI 传输函数的方式、我在每次传输中传输10位、因为这就是 OLED 驱动器 WS0012在 SPI 模式下运行的方式。

void SPI_Transfer (uint8类型、uint8值)

   EALLOW;
   
   GpioG1DataRegs.GPADP.bit.GPIO19=0; //启用 LCD 上的低电平有效从器件选择引脚以开始通信



    if (data==type)       //设置 data (1)/command (0)标志
    {    
        SpiaRegs.SPITXBUF=1; //将 MOSI 设置为高电平
        while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}
        dummy5 = SpiaRegs.SPIRXBUF;
    }
    其他
    {
        SpiaRegs.SPITXBUF=0; //将 MOSI 拉低
        while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}
        dummy5 = SpiaRegs.SPIRXBUF;
    }

   //将其计时。
    GpioG1DataRegs.GPADD.bit.GPIO18=0;
    GpioG1DataRegs.GPADAT.bit.GPIO19=1;

   //清除要写入的读取(1)/写入(0)标志

      SpiaRegs.SPITXBUF=0; //将 MOSI 拉低,因为您始终要写入 LCD,而不是从 LCD 读取。
     while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}
     dummy3 = SpiaRegs.SPIRXBUF;

   //数据中的时钟
    GpioG1DataRegs.GPADD.bit.GPIO18=0;
    GpioG1DataRegs.GPADD.bit.GPIO18=1;

      for (掩码= 0x80;掩码;掩码>>=1)
       {
        if (掩码和值)

            {
           SpiaRegs.SPITXBUF=1;      //如果为 true,则将 MOSI 设置为高电平
           while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}
           dummy4 = SpiaRegs.SPIRXBUF;
        }
        其他

            {
           SpiaRegs.SPITXBUF=0;               //如果为 false,将 MOSI 拉至低电平
           while (SpiaRegs.SPISTS.bit.INT_flag!= 1){}
           dummy5 = SpiaRegs.SPIRXBUF;
        }

          //将其计时
          GpioG1DataRegs.GPADD.bit.GPIO18=0;
          GpioG1DataRegs.GPADD.bit.GPIO18=1;
          }


  //禁用低电平有效的从器件选择引脚并结束通信一个周期
      GpioG1DataRegs.GPADAT.bit.GPIO19=1;
 
      EDIS;

我正在查看 DSP 板上 SPI-A 引脚的示波器输出、并在 SPI-STEA 信号和 SPI-CLK 信号上获得正确的输出。 但我在 MOSI 引脚上看不到任何输出。

我出了什么问题? 我们非常感谢您的任何建议或帮助。 我还在下面添加了 SPI 初始化和配置函数、

空 InitSpi (空)

   //初始化 SPI-A

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

   //启用主设备(0 =从设备,1 =主设备)
   //启用传输(TALK)
   //时钟相位(0 =正常、1 =延迟)
   //禁用 SPI 中断
   SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//主模式
   SpiaRegs.SPICTL.bit.TALK = 1;//启用传输
   SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位正常
   SpiaRegs.SPICTL.bit.SPIINTENA=0;//禁用 SPI 中断

   //设置波特率
   SpiaRegs.SPIBRR = SPI_BRR;// SPI 的波特率

   //设置空闲位
   //在断点上停止不会停止 SPI
   SpiaRegs.SPIPRI.bit.FREE = 1;

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


空 InitSpiaGpio()


   EALLOW;

/*为所选引脚启用内部上拉*/

//上拉使能应在中设置
// M3代码中的 GPIO_O_PUR 寄存器。

/*将所选引脚的限定条件设置为仅异步*/

//这将为所选引脚选择异步(无限定条件)。
//注释掉其他不需要的行。

   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;


谢谢、

Srini.

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

    您好 Srini、
    您检查了 SPITXBUF 是否实际被写入到正确的位置?


    此致、
    Marlyn

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

    感谢你能抽出时间。 我一直在关注 SPIA 寄存器的持续刷新。 在任何给定的时间、SPIRXBUF 与 SPDAT 的内容完全匹配。 我的问题是、我从未在示波器的 MOSI 引脚上看到任何输出。 此外、SPISTS 寄存器始终为0x0000。 这意味着永远不会设置 SPI INT 标志。 但无法诊断原因。 对我可以在代码中更改什么内容有任何建议?

    Srini.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Srini,
    我注意到您发布 了类似的 e2e.ti.com/.../2581673帖子
    我想关闭这个并回复该主题。

    此致、
    Marlyn