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.

[参考译文] TM4C123GH6PM:无法从 Rx FIFO SPI 读取数据

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/940136/tm4c123gh6pm-cannot-read-data-from-rx-fifo-spi

器件型号:TM4C123GH6PM

大家好,我正在构建自己的 SPI 驱动程序,我正在使用微型视觉  

每次我写入 DR 寄存器时、数据都会正确发送、所需的接收数据会写入 DR 寄存器(我知道、因为它出现在调试模式中)
当我尝试将该数据放入变量时、它的读数为零  

 我的代码  

#define SRAM 0x20000000

int main (void){
SYSCTL_Type* pSYSCLC;
pSYSCLC-SYSCTL;
pSYSCLC->RCGCSSI |=(1<2);
pSYSCLC->RCGCGPIO |=(1<1);
GPIOA_Type* pGPIO;
pGPIO = GPIOB;
pGPIO->DIR |=(1<<4);
pGPIO->DIR |=(1<<5);
pGPIO->DIR &=~(1<<6);
pGPIO->DIR |=(1<<7);
pGPIO->DATA |=(uint32_t)(1<5);
pGPIO->AFSEL |=(1<4);
pGPIO->AFSEL |=(1<5);
pGPIO->AFSEL |=(1<6);
pGPIO->AFSEL |=(1<7);
pGPIO->PCTL |=(0x2222<16);
pGPIO->PUR |=(0xF<4);
pGPIO->DEN |=(0xF<4);
 

SSI0_Type * PSSI;
PSSI = SSI2;
PSSI->CR1 &=~
~(UINT32_t)(1<PSI-1<PSI-1<PSI-1<PSR<1<1<PSI-1<PSI-1<PSI-1<PSR<0<PSR<1<PSI-1<PSI-1<PSR<1<1<PSI-<PSI-1<PSR<PSR<1<1<PSI-<PSI


PSSI->CR0 |=(1<<6);
PSSI->CR0 |=(1<7);
PSSI->CR0 |=(0x7<0);
PSSI->CR1 |=(1<1);

pGPIO->DATA &=~(uint32_t)(1<5);


PSSI->DR |=(0x80);
while (PSSI->SR &(1<<4));
*((uint32_t *) SRAM)=PSSI->DR;//=PSSI->DR;
pGPIO->DATA |=(uint32_t)(1<5); 

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

    您好!

     首先、请参阅此常见问题 解答 https://e2e.ti.com/support/microcontrollers/other/f/908/t/695568中的注4。 基本上、我们不支持 DRM 编码风格、因为它很容易出错。 我们提供具有成熟 API 的 TivaWare 库来开发您的应用。 请使用 TivaWare 或至少查看 API 的源代码、了解如何对它们进行编码以读取 SPI FIFO。  

     尽管如此、我认为一个可能的问题是 RXFIFO 中已经有剩余数据、您正在读取剩余数据而不是真实数据。 您要做的就是这样。

     1:通过读取 RXFIFO 中的所有数据来清空 RXFIFO、直到 RXFIFO 为空。

     2.发送数据  

     3.阅读您的数据

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

    为什么您在未详细说明仍不起作用的情况下拒绝回答?

    我建议您参考 TivaWare SSI 示例、您可以在中找到该示例 /examples/peripherals/ssi. 下面是描述我在上次答复中提到的序列的代码片段。  

    //
    //从 SSI 端口读取任何残留数据。 这将确保接收
    // FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成
    //因为 SPI SSI 模式为全双工模式,允许您发送和
    //同时接收。 SSIDataGetNonBlocking 函数返回
    //返回数据时为"true",未返回数据时为"false"。
    //“非阻塞”函数检查接收中是否有数据
    // FIFO、如果没有、则不会"挂起"。
    //
    while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0]))
    {
    }
    
    //
    //初始化要发送的数据。
    //
    pui32DataTx[0]="S";
    pui32DataTx[1]='p';
    pui32DataTx[2]='I';
    
    //
    //显示 SSI 正在发送数据的指示。
    //
    UARTprintf ("sent:\n ");
    
    //
    //发送3个字节的数据。
    //
    for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)
    {
    //
    //显示 SSI 正在传输的数据。
    //
    UARTprintf ("'%c'"、pui32DataTx[ui32Index]);
    
    //
    //使用“阻塞”Put 函数发送数据。 此函数
    //将等待发送 FIFO 中有空间后再返回。
    //这使您可以确保发送的所有数据都将其输入
    //发送 FIFO。
    //
    SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]);
    }
    
    //
    //等待 SSI0完成传输发送 FIFO 中的所有数据。
    //
    while (SSIBusy (SSI0_BASE))
    {
    }
    
    //
    //显示 SSI 正在接收数据的指示。
    //
    UARTprintf ("\n 接收:\n ");
    
    //
    //接收3个字节的数据。
    //
    for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)
    {
    //
    //使用“阻塞”GET 函数接收数据。 此函数
    //将等待接收 FIFO 中有数据后再返回。
    //
    SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]);
    
    //
    //由于我们使用的是8位数据,所以屏蔽 MSB。
    //
    pui32DataRx[ui32Index]&= 0x00FF;
    
    //
    //显示 SSI0接收到的数据。
    //
    UARTprintf ("'%c'"、pui32DataRx[ui32Index]);
    }