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/TMS320F28335:无法从 tlv2548接收 SPI 数据

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/707827/ccs-tms320f28335-spi-data-couldn-t-be-received-from-tlv2548

器件型号:TMS320F28335
主题中讨论的其他器件:TLV2548ADS8332

工具/软件:Code Composer Studio

 我正在尝试将 tlv2548与 TMS320F28335连接。  这些引脚在此处定义为随附的图。  我从 TI 网站获得的代码是与 TMS320F28335对接的 ADS8332的内嵌。 为数据表添加 内容,我有 一些定制方法来定制 tlv2548。 下面还显示了自定义代码。 我的问题是我无法从从从器件接收数据(tlv2548)。  它在下面 以黄色突出显示的 while 循环处停止。 发送数据   、 SPICLK 在示波器上看起来正常。 您能帮我解决这个问题吗?

 提前感谢您。

#define BUF_SIZE 5 //采样缓冲区大小

#define size 4000// 8192 // ADC 结果缓冲区大小

#define Sampling_Period 1000 // 1000us 采样速度1ksps

#include "DSP28x_Project.h"//器件头文件和示例 include 文件

#define BUF_SIZE 5 //采样缓冲区大小

#define size 4000// 8192 // ADC 结果缓冲区大小

#define Sampling_Period 1000 // 1000us 采样速度1ksps

#include "DSP28x_Project.h"//器件头文件和示例 include 文件

¡¡μ A

UINT16 ADS833x_BUf[BUF_SIZE];

uint16 ADS833x_result[size];

// ADS8332 CFR:内部 OSC/手动触发/250kSPS/INT 低电平有效/禁用自动 nap /禁用 nap 和深度 nap /禁用 TAG

UINT16 ADS833x_CFR_Reg = 0xEBD;// 0xFBD 表示自动通道选择和手动触发/INT 功能

// 0x7BD 表示手动通道选择和手动触发、/INT 功能

UINT16 ADS833x_Write_COM = 0xA000;//用于写入 CFR 寄存器的命令

uint16 Reg_Word;

//此文件中找到的函数的原型语句。

//中断 void ISRTimer2 (void);

void delay_loop (void);

void SPI_xmit (uint16 a);

void SPI_Fifo_init (void);

void SPI_init (void);

void 错误(void);

void ADS833x_init (void);

void ADS833x_WriteRegister (UINT16数据);

UINT16 ADS833x_ReadRegister()

UINT16 ADS833x_ReadData()

void ADS833x_Channel_Select (uint16数据);

¡¡μ A

¡¡μ A

uint16 InByte、RDATA;

void main (void)

// uint16 sdata;//发送数据

// uint16 RDATA;//接收到的数据;

//步骤1. 初始化系统控制:

// PLL、安全装置、启用外设时钟

//此示例函数位于 DSP2833x_SYSCTRL.c 文件中。

InitSysCtrl()

//步骤2. 初始化 GPIO:

//此示例函数位于 DSP2833x_GPIO.c 文件和中

//说明了如何将 GPIO 设置为其默认状态。

// InitGpio();//针对此示例跳过

//仅为 SPI-A 功能设置 GP I/O

//此函数位于 DSP2833x_SPI.c 中

InitSpiaGpio()

//步骤3. 清除所有中断并初始化 PIE 矢量表:

//禁用 CPU 中断

Dint;

//将 PIE 控制寄存器初始化为默认状态。

//默认状态为禁用所有 PIE 中断和标志

//被清除。

//此函数位于 DSP2833x_PIECTRL.c 文件中。

InitPieCtrl()

//禁用 CPU 中断并清除所有 CPU 中断标志:

IER = 0x0000;

IFR = 0x0000;

//使用指向 shell 中断的指针初始化 PIE 矢量表

//服务例程(ISR)。

//这将填充整个表,即使是中断也是如此

//在本例中未使用。 这对于调试很有用。

//可以在 DSP2833x_DefaultIsr.c 中找到 shell ISR 例程

//此函数可在 DSP2833x_PieVect.c 中找到

InitPieVectTable()

//步骤4. 初始化所有器件外设:

//此函数位于 DSP2833x_InitPeripherals.c 中

// InitPeripherals ();//此示例不需要

SPI_Fifo_init();//初始化 SPI FIFO

SPI_init();// init SPI

InitSpiGpio()

¡¡μ A

ADS833x_init();

//步骤5. 用户特定代码:

//此示例中不使用中断。

InByte = 0x00;

for (;;)

//发送数据

// spi_xmit (sdata);

//等待数据被接收

ADS833x_Channel_Select (0x00);

InByte = ADS833x_ReadData();

while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}

//检查已发送的数据

// RDATA = SpiaRegs.SPIRXBUF;

// if (RDATA != InByte) error();

// if (sdata == 255)

// sdata = 0;

// sdata += 5;

¡¡μ A

//步骤7. 在此处插入所有本地中断服务例程(ISR)和函数:

void delay_loop ()

I;

对于(i = 0;i < 1000000;i++){}

¡¡μ A

错误()

asm (" ESTOP0");//测试失败!! 停下来!

适用于(;);

void SPI_init()

SpiaRegs.SPICCR.all =0x000F;//复位打开、上升沿、16位字符位

SpiaRegs.SPICTL.ALL =0x0006;//启用主控模式、正常相位、

//启用 TALK、禁用 SPI int

SpiaRegs.SPIBRR = 0x007F;

SpiaRegs.SPICCR.all =0x008F;//从复位中撤回 SPI

// SpiaRegs.SPICCR.bit.SPILBK = 0;

SpiaRegs.SPIPRI.bit.FREE = 1;//设置断点以避免干扰 xmission

void SPI_xmit (uint16 A)

SpiaRegs.SPITXBUF=A

void SPI_Fifo_init()

//初始化 SPI FIFO 寄存器

SpiaRegs.SPIFFTX.All=0xE040

SpiaRegs.SPIFFRX.All=0x204f

SpiaRegs.SPIFFCT.All=0x0

void ADS833x_Channel_Select (uint16数据)

数据=数据<< 12;

while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG!=0){}//等待 SPITXBUF 空闲

SpiaRegs.SPITXBUF =数据;

¡¡μ A

void ADS833x_init()//初始化 ADS833x

REG_Word = ADS833x_Write_COM + ADS833x_CFR_Reg;

ADS833x_WriteRegister (Reg_Word);// ADS833x 内部 CFR 寄存器配置

// while (SpiaRegs.SPISTS.bit.INT_flag!= 1)}//等待 RX 数据就绪

while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}

ADS833x_Buf[0]= ADS833x_ReadRegister ();

ADS833x_buf[1]= ADS833x_buf[0]和0x0FFF;

if (ADS833x_CFR_Reg!= ADS833x_Buf[1]) error ();//检查 CFR 寄存器内容

void ADS833x_WriteRegister (UINT16 Data)// Write CMR 和 CFR 寄存器

while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG!=0){}//等待 SPITXBUF 空闲

SpiaRegs.SPITXBUF =数据;

UINT16 ADS833x_ReadRegister ()//读取 CFR 寄存器

uint16 rData0;

while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG!=0){}//等待 SPITXBUF 空闲

SpiaRegs.SPITXBUF= 0x9000;

while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG!= 0){}//等待 SPITXBUF 空闲

rData0 = SpiaRegs.SPIRXBUF//读取 RXBUF 以清除 INT_FLAG

// while (SpiaRegs.SPISTS.bit.INT_flag!= 1)}//等待 RX 数据就绪

while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}

rData0 = SpiaRegs.SPIRXBUF

返回 rData0;

UINT16 ADS833x_ReadData()//读取转换数据

uint16 RDATA;

while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG!=0){}//等待 SPITXBUF 空闲

SpiaRegs.SPITXBUF= 0xE000;

while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG!= 0){}//等待 SPITXBUF 空闲

RDATA = SpiaRegs.SPIRXBUF//读取 RXBUF 以清除 INT_FLAG

// while (SpiaRegs.SPISTS.bit.INT_flag!= 1)}//等待 RX 数据就绪

while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}

RDATA = SpiaRegs.SPIRXBUF

返回 RDATA;

//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

//不再需要。

//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

uint16 rData0;

while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG!=0){}//等待 SPITXBUF 空闲

SpiaRegs.SPITXBUF= 0x9000;

while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG!= 0){}//等待 SPITXBUF 空闲

rData0 = SpiaRegs.SPIRXBUF//读取 RXBUF 以清除 INT_FLAG

// while (SpiaRegs.SPISTS.bit.INT_flag!= 1)}//等待 RX 数据就绪

while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}

rData0 = SpiaRegs.SPIRXBUF

返回 rData0;

UINT16 ADS833x_ReadData()//读取转换数据

uint16 RDATA;

while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG!=0){}//等待 SPITXBUF 空闲

SpiaRegs.SPITXBUF= 0xE000;

while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG!= 0){}//等待 SPITXBUF 空闲

RDATA = SpiaRegs.SPIRXBUF//读取 RXBUF 以清除 INT_FLAG

// while (SpiaRegs.SPISTS.bit.INT_flag!= 1)}//等待 RX 数据就绪

while (SpiaRegs.SPIFFRX.bit.RXFFST!=1){}

RDATA = SpiaRegs.SPIRXBUF

返回 RDATA;

//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

//不再需要。

//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

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

    您好 Fakadu、
    我认为您可能会在最终的 RDATA 值中收到0x0000、因此会导致错误。

    这是我认为可能发生的情况、

    在您的行之后、'ReG_Word = ADS833x_Write_COM + ADS833x_CFR_Reg;' ReG_Word 应为0xAEBD

    然后、您使用行'ADS833x_WriteRegister (Reg_Word);'将其写入 TX 缓冲器

    但是、之后当您包含行'ADS833x_buf[0]= ADS833x_ReadRegister ();'时
    代码转到指定的函数、在该函数中、您将0x9000写入 TX 缓冲区。
    第一次将 RX 缓冲区的内容分配给 rData0时、该值应为0xAEBD
    第二次将 RX 缓冲区的内容分配给 rData0时、该值应为0x9000
    您从函数返回的值将为0x9000

    ADS833x_buf[0]的内容将为0x9000
    由0x0FFF 产生的逐位带将产生0x0000

    然后在 if 语句中,'if (ADS833x_CFR_Reg!= ADS833x_Buf[1]) error ();
    ADS833x_CFR_Reg 和 ADS833x_Buf[1]永远不会相等

    我不知道为什么您将0x9000写入 TX 缓冲区、但是如果您希望代码超过突出显示的 if 语句、那么我将删除该语句并删除第二个 rData0分配。
    然后、0xAEBD 和0xFFF 将产生0xEBD、相当于 ADS833x_CFR_Reg 的值

    这是您遇到的吗?

    此致、

    Marlyn

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

    请提出一个问题。 说"SPI 不接收数据"太开放了。 请提供更多输入、例如范围、配置详细信息(而非 SPI 代码)、TRM 这么说时为什么未设置某个位等

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Marlyn、
    非常感谢您的回答。
    0x9000准备就绪 CFR 寄存器命令、如数据表中所指定。 后来、我观察到 SPISTE 始终处于高电平。 我想这是不接收数据的主要问题。 你有什么想法来解决这个问题吗?
    谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Manoj、
    非常感谢您的帮助。
    Haardware 引脚配置如上图所示、其中 GPIO 配置如下:

    GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;//启用 GPIO16上的上拉电阻器(SPISIMOA)
    GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;//启用 GPIO17上的上拉电阻器(SPISOMIA)
    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;//启用 GPIO18上的上拉电阻器(SPICLKA)
    GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;//启用 GPIO19上的上拉电阻器(SPISTEA)

    当我回复 Marlyn 时、SPISTE 在环回中断时始终处于高电平。 您是否会建议我通过一种方法来清除此错误?
    谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Fikadu、
    我假设您没有更改 InitSpiaGpio()函数中的任何内容? 更具体地说、您保留了 GPIO19被配置为 SPISTE 的器件。
    您是否会包括屏幕截图、其中显示了正确标记的信号、以更好地帮助您?

    此外、本帖子还讨论了类似的问题。 浏览它不会有任何伤害、
    e2e.ti.com/.../490553

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

    Fikadu、
    几天以来、我没有听到您的反馈、
    您是否能够获取屏幕截图或解决您的问题?
     
    此致、
    Marlyn

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Fikadu、
    我将很快关闭此主题。 如果您希望我不关闭该主题、请发帖。

    此致、
    Marlyn
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Marlyn、
    很抱歉耽误你的回答。 我刚刚转到了其他一些东西、因为它无法解决、我没有太多时间来处理它。
    我想,最好暂时关闭这个问题,如果我遇到问题,我会在我返回时打开。

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

    我们现在将关闭该线程。 如果您未在30天内回复、该主题将被锁定。 然后、您可以单击"提出相关问题"按钮、该按钮将创建一个新主题、但会添加指向此主题的链接。

    此致、
    标记