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.

[参考译文] TMS320F28377S:SPI 未按预期工作

Guru**** 2489685 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/604303/tms320f28377s-spi-not-working-as-expected

器件型号:TMS320F28377S

大家好、

我已经尝试实现基本的 SPI 单字符读取/写入、但没有完全成功。  如有必要、我可以提供更多详细信息、但让我从基础知识开始、我们将了解我是否可以发现我的错误。

设置: 我使用 USB 转 SPI 转换器(MCP2210)将 SPI 通道上的字符发送到 MCU 从设备。  在固件中、在接收中断时、我读取输入、然后写入一个字符(无论我在调试观察窗口中分配了什么值)。  无 FIFO 缓冲器。  所有多路复用器均已正确开启。  中断代码为:  

_interrupt spiRxIsr (void)
{
SpicRegs.SPIFFRX.bit.RXFFOVFCLR=1;//清除溢出标志
SpicRegs.SPIFFRX.bit.RXFFINTCLR=1;//清除中断标志
PieCtrlRegs.PIEACK.ALL |= M_6;SPICRxINTCLR=1;//清除中断标志 PieCtrl.SpicRegs.SpicData =


16
;/SpiData Spintrintru.SpiCR.SpiData = 16;/SpiData = SpinTIDRxInTIDRxData = 16;/SpinTIDTIDRxData = SpiCR.SpiCR.SpiCR.TID 

因此、读取的值和写入的值(以及在我的 PC 上读取的值)的结果都是奇数的。  每次读取后、SPIDAT 寄存器似乎不会被完全清空、因此我写入的值会继续逐位移位。  它是不一致的、并且在几个读取/写入周期中、读取和发送的数据是正确的。  让我知道我是否遗漏了某个东西、或者应该尝试一些具体的东西。  我花了一段时间、尝试了许多组合、但没有看到任何改进。

下面是我的初始化代码:

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

void SPI_InitSpiC (void)

//初始化 SPI-C

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

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

//在断点上停止不会停止 SPI

SpicRegs.SPIPRI.bit.FREE = 1;


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

//
// InitSpicGpio -初始化*** GPIO
//
void SPI_InitSpiCGpio()

EALLOW;

//
//为所选引脚启用内部上拉
//
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPCPUD.bit.GPIO69 = 0;//启用上拉
GpioCtrlRegs.GPCPUD.bit.GPIO70=0;
GpioCtrlRegs.GPCPUD.bit.GPIO71 = 0;

//
//仅将所选引脚的限定条件设置为异步
//
//这将为所选引脚选择异步(无限定条件)。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPCQSEL1.bit.GPIO69 = 3;//异步输入
GpioCtrlRegs.GPCQSEL1.bit.GPIO70 = 3;
GpioCtrlRegs.GPCQSEL1.bit.GPIO71 = 3;

//
//使用 GPIO 寄存器配置 SPI-A 引脚
//
//这指定哪些可能的 GPIO 引脚将是 SPI 功能
//引脚。
//注释掉其他不需要的行。
//

//G-Mux
GpioCtrlRegs.GPCGMUX1.bit.GPIO69 = 3;// MOSI
GpioCtrlRegs.GPCGMUX1.bit.GPIO70 = 3;// MISO
GpioCtrlRegs.GPCGMUX1.bit.GPIO71 = 3;// SCLK

//多路复用器
GpioCtrlRegs.GPCMUX1.bit.GPIO69 = 3;// MOSI
GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 3;// MISO
GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 3;// SCLK

EDIS;

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

    尊敬的 Eric:

    不建议直接访问 SPIDAT 寄存器。 相反、当您想要接收数据时、请读取 SPIRXBUF 寄存器。 SPIDAT 内容在完成后会自动复制到此内容。 在您有机会读取 SPIDAT 寄存器之前、另一个传输可能会损坏该寄存器。 当你想发送数据时、写入 SPITXBUF。

    此外、SPIFFRx 寄存器仅用于 FIFO 模式。 因此、当您不使用 FIFO 时、您无需访问该 FIFO。 在非 FIFO 模式下、您可以访问 SPISTS 以了解有关中断的详细信息。 请告诉我这是否能解决您的问题。

    此致、
    Kris

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

    在这里、我仍然无法取得任何进展。 这次我的测试是发送0x12、0x34并尝试接收0x56、0x78。

    我的 RX 中断(SpicRegs.SPICCR.bit.SPICHAR = 7)如下:

    __attribute__( ramfunc ))
    _interrupt void spiRxFifoIsr (void)

    SpicRegs.SPIFFRX.bit.RXFFOVFCLR=1;//清除溢出标志
    SpicRegs.SPIFFRX.bit.RXFFINTCLR=1;//清除中断标志
    PieCtrlRegs.PIEACK.ALL |= M_INT6;//发出 PIE ACK

    spiRxData = SpicRegs.SPIRXBUF;
    SpicRegs.SPITXBUF = spitxData;




    有什么想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我应该清楚、我不希望我的 spiRxData 接收0x1234、因为我每次只录制一个字节。 在主器件端、我期望接收0x56、由于 TX 缓冲区只应将最左侧的8位推入、因此不发送0x78。

    我还尝试将位数设置为16。 仍然不幸运。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eric、

    您的传输函数现在是什么样的? 您正在接收哪些数据?

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

    不确定传输函数是什么意思。 MCU 充当从器件。

    数据通常是垃圾。 偶尔会遇到正确的值。

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

    您能否发布接收值与预期值的表格? 如果它们沿这些线移动一个位或某个东西、我会感兴趣。  还请在传输前后包含 SPIDAT 寄存器内容。

    此致、

    Kris