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.

[参考译文] TMS320F28375D:F28375和 TPS63581A-Q1之间的 SPI 通信问题

Guru**** 2446760 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/891591/tms320f28375d-spi-communication-problem-between-f28375-and-tps63581a-q1

器件型号:TMS320F28375D

您好的团队:

目前、我正在研究 f28375与电源管理芯片 TPS65381之间的 SPI 通信。  我无法读取 TPS65381寄存器的数据。 我的代码是否有任何问题?

SPI 配置:

void InitSpicGpio()
{

EALLOW;

/*为所选引脚启用内部上拉*/
//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。

GpioCtrlRegs.GPCPUD.bit.GPIO69 = 0;//启用 GPIO69上拉电阻器(SPISIMOC)
// GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;//启用 GPIO5上拉电阻器(SPISIMOA)
GpioCtrlRegs.GPCPUD.bit.GPIO70 = 0;//启用 GPIO70 (SPISOMIC)上的上拉
电阻// GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0;//启用 GPIO3上的上拉电阻(SPISOMIA)
GpioCtrlRegs.GPCPUD.bit.GPIO71 = 0;//启用 GPIO71上的上拉电阻器(***)
GpioCtrlRegs.GPCPUD.bit.GPIO72=0;//启用 GPIO72 (SPISTEC)上的上拉电阻

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

GpioCtrlRegs.GPCQSEL1.bit.GPIO69 = 3;//异步输入 GPIO69 (SPISIMOC)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 3;//异步输入 GPIO5 (SPISIMOA)
GpioCtrlRegs.GPCQSEL1.bit.GPIO70 = 3;//异步输入 GPIO70 (SPISOMIC)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 3;//异步输入 GPIO3 (SPISOMIA)
GpioCtrlRegs.GPCQSEL1.bit.GPIO71 = 3;//异步输入 GPIO71 (***)
GpioCtrlRegs.GPCQSEL1.bit.GPIO72 = 3;//异步输入 GPIO72 (SPISTEC)

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

GpioCtrlRegs.GPCMUX1.bit.GPIO69=1;//将 GPIO69配置为 SPISIMOC
// GpioCtrlRegs.GPAMUX1.bit.GPIO5=2;//将 GPIO5配置为 SPISIMOA
GpioCtrlRegs.GPCMUX1.bit.GPIO70=1;//将 GPIO70配置为 SPISOMIC
// GpioCtrlRegs.GPAMUX1.bit.GPIO3=2;//将 GPIO3配置为 SPISOMIA
GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 1;//将 GPIO71配置为***
GpioCtrlRegs.GPCMUX1.bit.GPIO72=1;//将 GPIO72配置为 SPISTEC

EDIS;
} 

void InitTPS65381ASpi (void)
{
GPIO_SetupPinMux (68、0、0); // reset_power
GPIO_SetupPinOptions (68、1、0);
GpioDataRegs.GPCCLEAR.bit.GPIO68=0;

GPIO_SetupPinMux (69、0、6); // SDI、SIMO
GPIO_SetupPinOptions (69、1、GPIO_异 步| GPIO_PULLUP);
//GpioDataRegs.GPCCLEAR.bit.GPIO70=1;

GPIO_SetupPinMux (70、0、6); // SDO、SOMI
GPIO_SetupPinOptions (70、0、GPIO_异 步| GPIO_PULLUP);


GPIO_SetupPinMux (71、0、6); // SCLK、CLK
GPIO_SetupPinOptions (71、1、GPIO_异 步| GPIO_PULLUP);

GPIO_SetupPinMux (72、0、6); // nCS、CS
GPIO_SetupPinOptions (72、1、GPIO_异 步| GPIO_PULLUP);


EALLOW;

***.***.all =0x004F; //复位打开、上升沿、16位字符位
***.***.all =0x0006; //启用主控模式、正常相位、
***.SPIBRR.ALL =39;//24;/0x0009; //***= 200m / 4/(7)= 7.14M,***最大值为8M
***.SPISTS.ALL = 0x0000; //重置所有状态信息
***.SPIPRI.ALL = 0x0010; //设置断点以使断点不会干扰 xmission
///***.***.bit.SPILBK = 1;


/*重置两个 FIFO */
***.SPIFFTX.bit.TXFIFO = 0;
***.SPIFFRX.bit.RXFIFORESET = 0;/*并在配置期间将它们保持在复位状态*/
/*配置 FIFO */
***.SPIFFTX.ALL = 0x4041;/*启用 FIFO,请勿使用中断*/
***.SPIFFRX.ALL = 0x4041;//设置 RX FIFO,不要使用中断*/
***.SPIFFCT.ALL = 0x0000;/* FIFO 和 TXBUF 之间无延迟*/
/*从复位中释放 FIFO */
***.SPIFFTX.bit.TXFIFO = 1;/*启用 TX *
***.SPIFFRX.bit.RXFIFORESET = 1;/*启用 Rx *

***.***.bit.SPISWRESET = 1;
EDIS;
} 

读取寄存器:

UINT16 ReadRegsTPS65381 (uint16 RegAddr)
{
UINT16 Rx = 0x0;
#if 0
EALLOW;
GpioDataRegs.GPCDAT.bit.GPIO72=0;
EDIS;
#endif
RX |=((RegAddr << 8)& 0xFFFF);
***.SPITXBUF = Rx;
/*等待传输完成*/
while (***.SPIFFRX.bit.RXFFST < 1)
{}
//Rx =***.SPIRXBUF & 0xff;
RX =***.SPIRXBUF;
#IF 0
EALLOW;
GpioDataRegs.GPCDAT.bit.GPIO72=1;
EDIS;
#endif
返回(Rx);
} 

此致

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

    FF、

    我简要浏览了您的代码、并进行了如下观察。

    观察结果:

    1. 为什么您有两个函数InitSpicGpio()InitTPS65381ASpi和函数执行相同的函数。 您只需使用一个函数、如下所示。 此外,在***信号的两个功能中配置 GPIO 时也不正确。

    InitTPS65381ASpi()


    GPIO_SetupPinOptions (69、GPIO_INPUT、(GPIO_ASYNC|GPIO_PULLUP));
       GPIO_SetupPinMux (69、GPIO_MUX_CPU1、15);

    GPIO_SetupPinOptions (70、GPIO_INPUT、(GPIO_ASYNC|GPIO_PULLUP));
       GPIO_SetupPinMux (70、GPIO_MUX_CPU1、15);

    GPIO_SetupPinOptions (71、GPIO_INPUT、(GPIO_ASYNC|GPIO_PULLUP));
       GPIO_SetupPinMux (71、GPIO_MUX_CPU1、15);

    GPIO_SetupPinOptions (72、GPIO_INPUT、(GPIO_ASYNC|GPIO_PULLUP));
       GPIO_SetupPinMux (72、GPIO_MUX_CPU1、15);

    此外、您的 SPI 配置看起来也不正确。 您的代码中未设置 SPIFFTX.SPIRST 位、这将不允许您发送或接收。 您的代码中可能存在其他问题。 我建议您在 example_2837xDSpi_FFDLB_int.c 中查看 F2837xD_SPI.c 中的 InitSpi ()函数和 SPI_Fifo_init ()函数、然后相应地修改代码。

    此外、您还需要传输 MOSI 引脚的虚拟值、以便在 SOMI 引脚上从从从器件接收数据。

    3.您还必须仔细研究 TPS65381 SPI 数据格式并相应地发送命令和数据。

    4.请查看 SPI 总线信号,并查看 SPI 是否正在发送您期望发送的信号。 这样可以很好地了解您是否正确配置了 SPI。

    希望这对您有所帮助。

    此致、

    曼诺伊

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

    此问题是否已解决?