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-B 通信问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/623732/tms320f28377s-spi-b-communication-issue

器件型号:TMS320F28377S

大家好、

我正在尝试将 TI TMS320F28377 LaunchPad 与加速计相连接、这是我 在这组硬件上的第一次实践经验。 我使用的是 SPI-B 参考  controlSUITE 中给出的示例、我编写了基本代码、并连接了逻辑分析仪以观察通信。 代码会执行、我可以看到正在进行通信。 但逻辑分析仪无法为我解码通信。  InitSysCtrl()将我的系统时钟设置为200MHz,而我的加速计在 SPI 线路上运行为10MHz。 然后、我尝试通过 SPI-B 传输一些测试数据 我不确定是否使用 FIFO。 提前感谢。

//######################################################################################################################
//
////文件:main.c
//
////############################################################################################################

//包含的文件
#include 

#include "F28x_Project.h"
#include "F2837xS_Examples.h"

//定义
#define SPI_TIMEOUT 1000

//*
@简要初始化加速计的 SPI-B GPIO
*@param none
*@return none
*/
void SPI_b_GPIO_init (void)
{
EALLOW;

//为所选引脚启用内部上拉
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;//启用 SPI CLK B 上的上拉
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;//启用 SPI STE B 上的上拉
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;//启用 SPI SIMO B 上的上拉
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;//启用 SPI SOMI B 上的上拉

//仅将所选引脚的限定条件设置为异步
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//异步输入 SPI CLK B
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//异步输入 SPI STE B
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//异步输入 SPI SIMO B
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;//异步输入 SPI SOMI B

//配置组多路复用器
GpioCtrlRegs.GPBGMUX2.bit.GPIO58=1;
GpioCtrlRegs.GPBGMUX2.bit.GPIO59=1;
GpioCtrlRegs.GPBGMUX2.bit.GPIO60=1;
GpioCtrlRegs.GPBGMUX2.bit.GPIO61=1;

//使用 GPIO 寄存器配置 SPI-B 引脚
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 2;//配置为 SPI CLK B
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 2;//配置为 SPI STE B
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 2;//配置为 SPI SIMO B
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 2;//配置为 SPI SOMI B

EDIS;
}

//
*@

@brief 此函数会将 SPI-B 初始化为已知状态*@param none * return none
*/
void SPI_b_init (void)
{
//在配置更改之前将 RESET 设置为低电平
SpibRegs.SPICCR.bit.SPISWRESET = 0;

SpibRegs.SPICCR.bit.CLKPOLARITY = 1;//时钟极性(1 =下降)
SpibRegs.SPICCR.bit.SPICHAR =(8-1);// 8位字符

SpibRegs.SPICTL.bit.CLK_PHASE = 1; //时钟相位(1 =延迟)
SpibRegs.SPICTL.bit.MASTER_SLAVE = 1;//启用主设备(1 =主设备)
SpibRegs.SPICTL.bit.TALK = 1; //启用传输(TALK)
SpibRegs.SPICTL.bit.SPIINTENA=0; //禁用 SPI 中断

//设置波特率
// CPU CLK 频率= 200MHz、SPI CLK 频率= 1MHz
// LSPCLK freq = CPU freq /4 (缺省情况下)
// BRR =(LSPCLK 频率/SPI CLK 频率)- 1.
SpibRegs.SPIBRR.bit.SPI_BIT_RATE =((200E6 / 4)/ 10E5)- 1;

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

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

//
*@简要主函数
*@param none
*@return none
*/
void main (void)
{
/*
*初始化系统控制:
* PLL、看门狗、启用外设时钟
*此示例函数位于 F2837xS_SYSCTRL.c 文件中。
*
InitSysCtrl();

//初始化 GPIO:
InitGpio();

spi_b_gpio_init ();

/*
*清除所有中断并初始化 PIE 矢量表:
*禁用 CPU 中断
*
Dint;

/*
*将 PIE 控制寄存器初始化为默认状态。
*默认状态为禁用所有 PIE 中断和标志
*被清除。
*此函数位于 F2837xS_PIECTRL.c 文件中。
*
InitPieCtrl();

//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;

/*
*使用指向 shell 中断的指针初始化 PIE 矢量表
*服务例程(ISR)。
*这将填充整个表、即使是中断也是如此
本示例中未使用*。 这对于调试很有用。
* shell ISR 例程位于 F2837xS_DefaultIsr.c 中
*此函数位于 F2837xS_PieVect.c 中
*
InitPieVectTable();

//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//初始化设备外设:
spi_b_init ();

UINT16 SPI_TIMEOUT = SPI_TIMEOUT;

SpibRegs.SPITXBUF = 0x0F | 0x80; //发送缓冲器

while ((SpibRegs.SPISTS.bit.INT_flag!= 1)&&(SPI_TIMEOUT > 0U))
{
//等待字符已传输
SPI_TIMEOUT--;
}

if (SPI_TIMEOUT = 0U)
{
PUT ("SPI_TIMEOUT 1\n");
}

SPI_TIMEOUT = SPI_TIMEOUT;

SpibRegs.SPITXBUF = 0x00; //发送缓冲器

while ((SpibRegs.SPISTS.bit.INT_flag!= 1)&&(SPI_TIMEOUT > 0U))
{
//等待字符已传输
SPI_TIMEOUT--;
}

uint16 RDATA = SpibRegs.SPIRXBUF;

返回;
}

//文件结束

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

    Anand、您好!

    很抱歉、回答很慢。 您在这方面是否取得了任何进展?

    我注意到一件事-当你的字符小于16位时、你需要在把数据写入 TXBUF 寄存器时保留对齐数据。 在您的情况下、这意味着您需要将数据左移8位。

    惠特尼

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

    Whitney、

    我也尝试使用一组其他测试 数据来移动数据。 但运气不好! 我怀疑由微控制器控制的 CS 线路在这两者之间变为高电平可能是问题的一部分。

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

    即使在您移动数据后、您在 MOSI 线路上仍然只能看到0吗?

    CS 线路是否在消息之间变为高电平是一个问题将取决于您的从设备所需的内容。 这里有一个有关 STE 引脚行为的主题、以及如何使用 GPIO 代替该行为对从器件不起作用。

    e2e.ti.com/.../490553

    惠特尼

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

    Whitney、我可以看到一些数据在 MOSI 线路上输出、但我的逻辑分析仪无法对其进行解码。

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

    我想知道您的逻辑分析仪设置是否有问题。 自从我使用 Saleae Logic 以来已经有一段时间了、因此我不记得它们是如何配置的、但请确保您具有正确的相位和极性设置。 此外、作为一个实验、看看如果您降低 SPI 时钟速度、它是否能够解码。

    惠特尼