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/EK-TM4C1294XL:SSI 数据获取

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/587337/ccs-ek-tm4c1294xl-ssi-data-get

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:ADC161S626EVMStrike

工具/软件:Code Composer Studio

我使用 SSI 将 EK-TM4C94XL 与 ADC161S626EVM Booster Pack 进行通信。

调试我的代码时、我看到它在  SSIDataGet 的部分中停止(...)。  单步执行此函数时、它停止的部分如下所示:

//等待直至有数据要读取。
//
while (!(HWREG (ui32Base + SSI_O_SR)& SSI_SR_RNE))

以下是代码:

#include
#include
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/ssi.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "inc/hw_types.h"

uint32_t ui32SysClkFreq;

无效
UARTPrompt (uint32_t str[])

uint8_t i = 0;

while (str[i]!='\0'){

UARTCharPut (UART0_BASE、str[i]);

i++;

无效
InitPORTE (空)

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE))

GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、GPIO_PIN_4);

GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、1);

无效
InitConsole (空)

//
//启用 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);

//
//为这些引脚选择替代(UART)功能。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);

//
//使用内部16MHz 振荡器作为 UART 时钟源。
//
//UARTClockSourceSet (UART0_BASE、UART_CLOCK _PIOSC);

//
//初始化控制台 I/O 的 UART
//
UARTConfigSetExpClk (UART0_BASE、ui32SysClkFreq、115200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);

内部
main (空)

uint32_t pui32DataRx[3];
uint32_t ADCRx[16];
uint8_t i;

//
//将时钟设置为直接从外部晶振/振荡器运行。
// TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
板上的//晶体。
//

ui32SysClkFreq = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);

//
//设置用于显示消息的串行控制台。 这是
//仅用于此示例程序,SSI 操作不需要。
//
InitConsole();

InitPORTE();


SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);


SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);

GPIOPinConfigure (GPIO_PD3_SSI2CLK);
GPIOPinConfigure (GPIO_PD2_SSI2FSS);
GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);
GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);


GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 |
GPIO_PIN_3);

SSIConfigSetExpClk (SSI2_base、ui32SysClkFreq、SSI_FRF_MOTO_MOTO_MODE_1、
SSI_MODE_MASTER、1000000、8);

HWREG (SSI2_base + 0x004)= 0x00000001;


SSIEnable (SSI2_base);

//
//从 SSI 端口读取任何残留数据。 这将确保接收
// FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成
//因为 SPI SSI 模式为全双工模式,允许您发送和
//同时接收。 SSIDataGetNonBlocking 函数返回
//返回数据时为"true",未返回数据时为"false"。
//“非阻塞”函数检查接收中是否有数据
// FIFO、如果没有、则不会"挂起"。
//
while (SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0]))

GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、0);

UARTCharPut (UART0_BASE、"T");
UARTCharPut (UART0_BASE、'\n');

for (i=0;i<16;i++){

SSIDataGet (SSI2_base、&ADCRx[i]);


UARTPrompt (ADCRx);

返回(0);

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

    [引用 USER="Geovani Alves"] GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、1);[/引用]

    虽然不是问题的原因-您的第三个参数不会导致端口"E_4"输出高电平。   您必须将最终参数更改为第二个参数反映的"位位置值"。  (在您的案例中为"16"。)  您也可以重复使用第二个参数"GPIO_PIN_4"。   使用"1"将使 Portx、Pin_0 (仅限)产生高电平。

    我个人认为有"太多"无关代码、使您希望查看的代码模糊不清。   简单的"突出显示"可以更好地指导您的帮助者-减少他们的"磨损/撕裂"。  典型的-说明您问题的最小代码-证明是最佳的...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    除了 CB1的注释之外、我看到下面的行启用 bit0回送并禁用 bit2中的 SSI。

    HWREG (SSI2_base + 0x004)= 0x00000001;


    我也看不到您调用 SSIDataPut()。 SSI 为全双工。 即使只从从机读取数据、也仍然需要传输虚拟数据、这就是 SSI 启动时钟的方式。 如果没有时钟、从器件将无法响应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问候 Charles -我想知道 DRM 在主要 API 代码中的"混合"情况-它超出了我的兴趣/耐心、让我"额外(不必要)进行 DRM 查找!"

    而"SSIDataPut ()"的"缺失"必然会使 SPI 时钟平静。   (另一个"相似"的气泡-代表您)

    海报是否应该(部分)努力"减轻帮助者的努力?" (如果不在这里-现在-如果他们进入行业-并请求此类(努力-简化)"援助"、则不会对此表示赞赏。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    感谢您在周末为论坛提供帮助。 也许海报有时试图启用回送模式以进行一个简单测试、而没有可用的 SSI API。

    您好、Geovani、
    如果在 API 中错过了 SSI 模块,则可以使用 SSIEnable()来启用它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    按"位位置值"、您意味着对于位4、您喜欢0x08?

    我对帖子很抱歉。 我在论坛中是新手。 我下次会尝试做得更好。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Charles 我不知道为了启动 SSI 时钟而必须发送虚拟数据。

    但是、当我运行代码并打开 PuTTY 控制台时、它会显示以下屏幕:

    它提供了我通过 SSI 在中传输的内容、但我正在尝试获取 ADC 的输出值。

    下面是我为了获取 SSI 时钟(突出显示的时钟)而插入的代码的一部分:

    while (SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0]))


    pui32DataTx[0]="S";
    pui32DataTx[1]='p';
    pui32DataTx[2]='I';

    for (ui32Index = 0;ui32Index < 3;ui32Index++)



    //显示 SSI 正在传输的数据。

    UARTPrompt (pui32DataTx[ui32Index]);


    //使用“阻塞”Put 函数发送数据。 此函数
    //将等待发送 FIFO 中有空间后再返回。
    //这使您可以确保发送的所有数据都将其输入
    //发送 FIFO。

    SSIDataPut (SSI2_base、pui32DataTx[ui32Index]);


    GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、0x00);

    UARTCharPut (UART0_BASE、"T");
    UARTCharPut (UART0_BASE、'\n');

    for (i=0;i<16;i++){

    SSIDataGet (SSI2_base、&ADCRx[i]);

    UARTPrompt (ADCRx);

    谢谢。 第一个帖子、抱歉。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Geovani、
    小幅校正。 位4应该是0x10、而不是0x08。 根据 CB1的建议、您可以改用:
    GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、GPIO_PIN_4)而不是 GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、0x10)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    没有人要求您"悲伤"-但事实证明、"思考-并尝试减轻他人的努力-尤其是当您请求他们的帮助时!" 很遗憾论坛管理。 在这方面没有正确宣传或指导海报。 (我写了几个宣言-埋没了-这个和早期的论坛...

    提供涵盖"每个角落和缝隙"的代码对您来说很容易(简单剪切/粘贴所有内容)-同时使我们的评论更难/更长。   最短的代码块、用于呈现/证明您的问题-而是呈现-是理想的!  (并且、"缩短代码列表"最常被证明对您有帮助的想法将提高您的信心和理解!)

    DRM 代码格式也强制"查找、打开和强烈审核 MCU 手册以及寄存器审查/重新读取-由所有帮助者执行!"   (即使是供应商代理-也无法立即调用寄存器和 KEY 寄存器位值的质量。)   这种"额外的、不需要的努力"-通常是通过 API "为您(和我们)完成"。   并且已经多次得到验证。 DRM -与之形成鲜明对比-证明始终是一次(不想要的)冒险!

    至您的"位4"问题:GPIO_PIN_7的值为"128"、PIN_6"64"、PIN_5"32"和 PIN_4"16"-这是我列出的值。 所有位和结果值的总和-当所有位为"高电平/打开"时、等于255。 (0xFF)另请注意、您可以通过一个 GPIO_Write 控制"所有端口位"!

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

    您好、Charles、

    [引用用户="Charles Tsaaa">您可以改用:
    GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、GPIO_PIN_4)而不是 GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_4、0x10)

    请注意-我建议(而不是)"位定位值方法"的灵感是将这张海报(以及所有其他海报)从可怕的"卡帕隧道综合症"中解救出来-已知会打击那些必须"设置"多个端口位的人-跨越多个端口。   BTW:供应商员工(仍然)是否从"Hand MD"收到"销售佣金"。 专家?"  (问-因为我的右手几乎已经痊愈了-剩下的一个还在颤抖-我可以"重复按键"-真的-不试...不试...不试...不试...)  

    长寿命"位定位值"和"通道/无疼痛/岩石稳定"手...  (不幸的是、我的双手都不"符合"该规范的任何部分。)

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

    [报价 USER="CB1_MOBILE "] BTW:供应商员工(仍然)是否从"Hand MD"收到"销售佣金"。 专家?"

    0美元。 :-)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    相关知识! 我将会“减少”一个“帐单”-减去(只是)那个数量...