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.

[参考译文] 编译器/TM4C123GH6PZ:SPI 通信

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/751345/compiler-tm4c123gh6pz-spi-communication

器件型号:TM4C123GH6PZ
Thread 中讨论的其他器件: EK-TM4C123GXL

工具/软件:TI C/C++编译器

您好、先生、

在 SPI 通信中、我遇到了一些问题。在我的程序中、将数据从主器件发送到从器件、从从从器件读取数据并将其显示在 UART 上。 主器件和从器件都使用相同的微控制器(TM4C123GH6PZ)。 我正在为主设备和从设备编写单独的程序。在主设备中,刷写程序用于发送字符,而从设备板,刷写程序用于通过 UART 读取和显示接收到的字符。

给定的吹气是我的主变速器程序

SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI0));
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOA));
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0RX);
GPIOPinConfigure (GPIO_PA5_SSI0TX);
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 |GPIO_PIN_3 | GPIO_PIN_2);

SSIConfigSetExpClk (SYSCTL_Periph_SSI0、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_MODE_0、SSI_MODE_MASTER、10000008);

SSIEnable (SYSCTL_Periph_SSI0);

SSIDataPut (SSI0_BASE、'A');
while (SSIBusy (SSI0_BASE));

下面给出了从器件中的接收程序

SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);//启用两个外设:
while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI0));
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOA));
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0RX);
GPIOPinConfigure (GPIO_PA5_SSI0TX);
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 |GPIO_PIN_3 | GPIO_PIN_2);

SSIConfigSetExpClk (SYSCTL_Periph_SSI0、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_MODE_0、SSI_MODE_SLAVE、10000008);

SSIEnable (SYSCTL_Periph_SSI0);

 while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx));

SSIDataGet (SSI0_BASE、&pui32DataRx);
UARTCharPut (UART0_BASE、pui32DataRx);

空 InitConsole (void)//UART 初始化  

UARTClockSourceSet (SYSCTL_Periph_UART0、UART_CLOCK_SYSTEM);
//
//启用 UART0模块。
//
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//
//等待 UART0模块准备就绪。
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_UART0));
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、115200、(UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE));

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、先生、
    很抱歉、我没有解释我面临的问题。 我无法显示从主设备发送的字符。硬件工作正常。 我没有遇到软件问题。
    谢谢、
    Alphy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Alphy、

    是否已检查是否通过断点正确接收字符? 如果问题是 SPI 传输或 UART 显示屏、则这会缩小范围。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、先生、

    我在接收字段中输入断点并进行测试、我无法读取任何数据、但器件正在通信、并在 UART 中发送一些垃圾值。 下面给出了在 UART 中接收的数据。  

    2018年11月30日09:59:06.336 [RX]- Ÿ°? ?€

    下面给出了从器件数据接收步骤。

    SSIEnable (SSI0_BASE);
    SSIDataGet (SSI0_BASE、&pui32DataRx);
    char_rx=(char) pui32DataRx;
    UARTCharPut (UART0_BASE、char_Rx);

    我需要在接收程序中添加任何其他函数来解决此问题。

    谢谢、

    Alphy

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

    您好、Alphy、

    感谢您提供这些信息、今天我有时间将您的代码放入项目中并运行一些测试。 以下是我对代码中问题的调查结果:

    1) 1) SSIConfigSetExpClk 和 SSIEnable 需要使用 SSI0_BASE 配置、而不是 SYSCTL_Periph_SSI0

    2) 2)您的 InitConsole 无法正常工作、我使用了以下内容:

    //
    
    //
    //此函数将 UART0设置为用于控制台,以便
    在示例运行时显示信息//。
    ////
    *****************
    void
    InitConsole (void)
    {
    //
    //启用 UART0以便我们可以配置时钟。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
    
    //
    启用用于 UART0引脚的 GPIO 端口 A。
    // TODO:将其更改为您正在使用的 GPIO 端口。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    
    //
    为端口 A0和 A1上的 UART0功能配置引脚复用。
    //如果您的器件不支持引脚复用、则无需执行此步骤。
    // TODO:更改此选项以选择您正在使用的端口/引脚。
    //
    GPIOPinConfigure (GPIO_PA0_U0RX);
    GPIOPinConfigure (GPIO_PA1_U0TX);
    
    //
    //使用内部16MHz 振荡器作为 UART 时钟源。
    //
    UARTClockSourceSet (UART0_BASE、UART_CLOCK _PIOSC);
    
    //
    为这些引脚选择备用(UART)功能。
    // TODO:更改此选项以选择您正在使用的端口/引脚。
    //
    GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
    
    //
    初始化控制台 I/O 的 UART
    //
    UARTStdioConfig (0、115200、16000000);
    } 

    3) 3)您的接收将不起作用、除非您的代码与您使用的 while 循环完全同时打开、并且在第一次没有数据时退出、请使用以下命令:

    while (!(SSIDataGetNonBlocking (SSI2_base、&pui32DataRx))); 

    4) 4)我认为第二 个 SSIDataGet 在这里没有意义、因为您需要获取一个字节、并且您已经在上面的行中执行了该操作、我会将其注释掉。

    请尝试应用这些更改、并查看您是否获得进一步的进展。

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

    您好 Ralph、

    1) 1) SSIConfigSetExpClk 和 SSIEnable 需要使用 SSI0_BASE 配置、而不是 SYSCTL_Periph_SSI0  

    已更正此错误。

    2) 2)您的 InitConsole 无法正常工作、我使用了以下内容:

    InitConsole 为我正常工作

    我尝试在初始化控制台中显示一个字符、它在 UART 中打印正确的数据。

    3) 3)您的接收将不起作用、除非您的代码与您使用的 while 循环完全同时打开、并且在第一次没有数据时退出、请使用以下命令:

    while (!(SSIDataGetNonBlocking (SSI2_base、&pui32DataRx))); 

    我尝试的这个仍然没有得到任何响应。 我使用了断点并检查了是否仍然在调试器中接收到任何字符。

    SSIEnable (SSI0_BASE);
    SSIDataGet (SSI0_BASE、&pui32DataRx);
    char_rx=(char) pui32DataRx;
    pui32DataRx &= 0x00FF;
    UARTCharPut (UART0_BASE、char_Rx);

    在突出显示的部分中到达调试器后 、箭头不会向下一个函数移动。 如需更多说明、请查找所附的调试器图像部分。

    谢谢、  

    Alphy

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

    也可以在 SSIDataGet 之后尝试忙时检查
    例如:
    SSIDataGet (SSI0_BASE、&pui32DataRx);

    while (SSIBusy (SSI0_BASE))


    UARTCharPut (UART0_BASE、pui32DataRx);


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

    您好、先生、

    我尝试了所有这些东西、但仍然在 SSIDataGet (SSI0_BASE、&pui32DataRx) 函数处停止。

    无论我从主器件 TX 引脚发送的数据是在从器件的 RX 引脚上接收的、都可以使用逻辑分析仪进行验证。

     我对芯片选择也有疑问、SSI_FRF_MOTO_MODE_0函数是芯片选择函数、还是有任何其他方法可以将芯片选择设置为低电平。

    请帮助我解决该问题。

    谢谢、

    Alphy

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

    您好、Alphy、

    为了简单起见、我为主设备和从设备附加了 c 文件、它们使用 SSI0发送单个字节、然后在从设备上接收该字节并打印到 UART。 我使用 EK-TM4C123GXL LaunchPad 对其进行了测试、测试效果很好。 请尝试使用此选项并查看您的问题是否已解决。 如果是、请比较配置和代码流、看看您是否可以了解出什么问题。

    主设备: e2e.ti.com/.../ssi_5F00_master.c

    从站: e2e.ti.com/.../ssi_5F00_slave.c

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

    您好、先生、

    非常感谢您发送该代码、我也尝试了该代码、但它没有读取数据。 我想有些问题与时钟速率有关。主席先生,我非常感谢你的帮助。

    我将检查我的从器件是否存在任何问题。  

    再次感谢主席先生的帮助。

    谢谢、

    Alphy