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:C28 SPI 与 LCD 相连

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/700064/ccs-f28m36p63c2-c28-spi-interfacing-with-lcd

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

工具/软件:Code Composer Studio

您好!

我正在尝试写入 SPI 传输函数、以将数据写入 Crystalfontz OFAL1602C OLED。 这就是我编写 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.

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

    Srinivasan、

    我认为您的传输功能不符合您的预期。

    有关 SPI 的工作原理、请参阅 F28M36器件 controlSUITE 中的 SPI 示例。

    我假设您正在尝试将数据传输到 LCD。 向 TSPIXBUF 写入1将在当前配置中的 SIMO 上发送0。 如果您要向 SPITXBUF 写入1、并且 SPI 配置为传输10位、它实际上只发送0、因为数据应该保持对齐。 您正在将0x0001写入 SPITXBUF。  由于 SPI 在传输小于16位时需要左对齐数据、因此它将移出高10位、在您的情况下、这些位都是0。 我也看不到您实际将数据写入 SPI 以进行传输的位置。

    最后、您为什么要写入 GPIO18来"计时"、然后 再写入 GPIO19。 当您调用 InitSpiaGpio 时、这些引脚分配给 SPI 函数。 SPI 将控制时钟和芯片选择、而无需任何 CPU 干预。 写入 SPITXBUF 将启动下一个传输、SPISTE 将按照配置被驱动、并且时钟将在数据被放置在 SIMO 上并被锁存在 SOMI 上时开始切换。

    请通读 TRM 中的 SPI 章节、并研究 controlSUITE 中提供的示例代码。 这些资源为您提供了了解和使用 F28M36x 上的 SPI 模块所需的基础。

    侧注:将来请使用 RTF 编辑器中的"插入代码"功能来共享代码。 它保留了 C 语法突出显示并使其更易于阅读。  

    此致、

    标记

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

    Mark、您好!

    非常感谢、这有助于理解我做得不正确的很多事情、我会记住这些事情。 很抱歉、我会记住在将来以正确的方式发布该规范。

    我基本上尝试在一个 SPI 传输中发送10位。 我在与 LCD 设计和操作相关的几个其他函数中反复调用此函数。

    不过、根据您的解释、我有一个查询、假设我要按顺序传输以下10个位
    1000000011
    我想从 MSB 开始、将它们逐一放入 TX 缓冲器中。 为此、我应首先向左发送 MSB、使其对齐15、
    然后下一个位左对齐14、然后左对齐13之后的位...那么、在我到达 LSB 之前一直向左移6?? 我对您的理解是否正确?

    我要再次强调的是、我已经阅读了手册中的 SPI 章节、并在控制套件中模拟了示例、但我可能还不够了解它们。 非常感谢您抽出宝贵的时间。 我将更详细地研究它们、看看我错过了什么。

    Srini.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Mark、我让它发挥了作用。 感谢您抽出宝贵时间为您提供帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Srini、
    您不必单独发送每个位、您可以一次发送全部10个位、只需将整个数据保持六位对齐即可。 SPIDAT 将负责将每个位发送到 SPIRXBUF。

    这更有意义吗?

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

    是的、Marylyn。 我明白了、它工作正常。 非常感谢