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/TM4C129ENCPDT:SPI 读取问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/702488/ccs-tm4c129encpdt-spi-reading-problem

器件型号:TM4C129ENCPDT
主题中讨论的其他器件:AMC7820TM4C123

工具/软件:Code Composer Studio

您好!

我正在使用 TM4C129ENCPDT。 我想使用 SPI 与 AMC7820通信。 我正在将值写入 AMC 7280的 DAC0、并使用 SPI 进行回读。  

当我执行多个读操作时,首先读回值正确,然后显示随机值。 经过一个周期后、它会显示正确的值

void SPIRead (int 端口、int 引脚、uint8_t * pui32DataTx、uint32_t ui32Count、int SPIBase)

char buf[25]={0};
int ireadValue=0;
GPIOPinWrite (端口、引脚、0);// CS 低电平;AMC 预期低电平有效控制信号
SysCtlDelay (SysCtlClockGet ()/3);//1秒延迟

SSIDataPut (SPIBase、pui32DataTx[0]);
SysCtlDelay (SysCtlClockGet ()/100);
while (SSIBusy (SPIBase));
SSIDataPut (SPIBase、pui32DataTx[1]);
SysCtlDelay (SysCtlClockGet ()/100);
//
//等待 SSI0完成传输发送 FIFO 中的所有数据。
//
while (SSIBusy (SPIBase));
for (ui32Index = 0;ui32Index < ui32Count;ui32Index++)

SSIDataPut (SPIBase、0xFF/*pui32DataTx[ui32Index]*/);
SSIDataGet (SPIBase、&pui32DataRx[ui32Index]);

SysCtlDelay (SysCtlClockGet ()/100);
while (SSIBusy (SPIBase));
pui32DataRx[0]&= 0x00FF;
pui32DataRx[1]&= 0x00FF;
GPIOPinWrite (端口、引脚、引脚);//将 CS 复位为高电平
SysCtlDelay (SysCtlClockGet ()/3);//1秒延迟

ireadValue = pui32DataRx[0];
ireadValue = ireadValue << 8;
ireadValue |= pui32DataRx[1];

sprintf (buf、"SPI 读取<%x>\n"、ireadValue);
UARTSend (((uint8_t *) buf、strlen (buf)、UART5_BASE);


void SPIwrite (int 端口、int 引脚、uint8_t * pui32DataTx、uint32_t ui32Count、int SPIBase)

char buf[25]={0};
int ireadValue=0;
GPIOPinWrite (端口、引脚、0);// CS 低电平;AMC 预期低电平有效控制信号
SysCtlDelay (SysCtlClockGet ()/3);//1秒延迟
//SysCtlDelay (SysCtlClockGet ()/100);

SSIDataPut (SPIBase、pui32DataTx[0]);
SysCtlDelay (SysCtlClockGet ()/100);
while (SSIBusy (SPIBase));
SSIDataPut (SPIBase、pui32DataTx[1]);
SysCtlDelay (SysCtlClockGet ()/100);
while (SSIBusy (SPIBase));

for (ui32Index = 2;ui32Index < ui32Count;ui32Index++)

SSIDataPut (SPIBase、pui32DataTx[ui32Index]);
SSIDataGet (SPIBase、&temp1/*和 pui32DataRx[ui32Index-2]*/);


while (SSIBusy (SPIBase));
GPIOPinWrite (端口、引脚、引脚);//将 CS 复位为高电平

SysCtlDelay (SysCtlClockGet ()/100);
ireadValue = pui32DataTx[2];
ireadValue = ireadValue << 8;
ireadValue |= pui32DataTx[3];

sprintf (buf、"SPI write <%x>\n"、ireadValue);
UARTSend (((uint8_t *) buf、strlen (buf)、UART5_BASE);

等待您的建议

此致

GPM

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不熟悉 AMC7280器件、也找不到任何相关信息。 您是否确定该器件输出正确的数据。 可能存在时序问题。 我建议您使用示波器或逻辑分析仪来查看 SSI 线路。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob:
    感谢您的回复。 实际上、部件号是 AMC 7820
    此致
    GPM
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、这更有意义。 您是否使用了示波器或逻辑分析仪? 您的延迟可能无法正常工作。 函数 SysCtlClockGet ()仅用于 TM4C123器件。 应使用函数 SysCltClockFreqSet()返回的值。 (确保你正在使用该函数来设置系统时钟而不是 SysCtlClockSet()。) 如何配置 SSI?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    我按如下方式配置 SSI

    void SSI2Init (void)//

    //
    //必须启用 SSI2外设才能使用。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);

    //
    //为端口 D0、D1和 D3上的 SSI0功能配置引脚复用。
    //
    GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);
    GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);
    GPIOPinConfigure (GPIO_PD3_SSI2CLK);
    //
    //配置 SSI 引脚的 GPIO 设置。
    //
    GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_3 | GPIO_PIN_1 | GPIO_PIN_0);
    //
    //为 SPI 主控模式配置和启用 SSI 端口。 使用 SSI2、
    //
    SSIConfigSetExpClk (SSI2_base、g_ui32SysClock、SSI_FRF_MOTO_MOTO_MODE_1、
    SSI_MODE_MASTER、1000000、8);
    //
    //启用 SSI2模块。
    //
    SSIEnable (SSI2_base);
    //
    //从 SSI 端口读取任何残留数据。
    //
    while (SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0]))


    此致

    GPM

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、您的格式看起来是正确的。 请记住,每次调用 SSIDataPut ()时,接收 FIFO 中也会接收到一个字节。 当您希望从 AMC7820读取寄存器时、您会"放入"构成读取命令的两个字节。 然后、您应该从接收 FIFO 中清除两个0字节。 现在、当您"放入"字节来生成实际读取时、每个"放入"之后可以紧跟一个"get"来读取数据。