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:SPI 将 TM4C123GH6PM 与 MCP4921进行通信

Guru**** 2470720 points
Other Parts Discussed in Thread: TM4C123GH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/674278/compiler-tm4c123gh6pm-spi-communicate-tm4c123gh6pm-with-mcp4921

器件型号:TM4C123GH6PM
主题中讨论的其他器件: TM4C123

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

我的对象正在将数据从 TM4C123GH6PM 传输到 MCP4921。 我的代码构建良好、但我无法从 MCP4921的引脚获取值。 有人知道我的数据传输是否正确?

非常感谢。

我的代码:

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

//#define NUM_SSI_DATA 1.

void SSI0_Interrupt (void);

uint32_t pui32DataTx;
uint32_t pui32DataRx;
uint32_t ui32Index;
volatile unsigned long g_ulSSI2RXTO = 0;

无效
InitConsole (空)

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

GPIOPinConfigure (GPIO_PB0_U1RX);
GPIOPinConfigure (GPIO_PB1_U1TX);

SysCtlPeripheralEnable (SYSCTL_Periph_UART1);

GPIOPinTypeUART (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);

UARTConfigSetExpClk (UART1_base、SysCtlClockGet ()、115200、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));
UARTEnable (UART1_BASE);


内部
main (空)


SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHz);

InitConsole();

UARTprintf ("SSI ->\n");
UARTprintf ("模式:SPI\n");
UARTprintf ("数据:8位\n");

SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);

SysCtlPeripheralEnable (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 (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_MODE_3、
SSI_MODE_MASTER、2000000、8);

SSIEnable (SSI0_BASE);
SSIIntEnable (SSI0_BASE、SSI_RXFF|SSI_RXTO);

while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx))


SSIIntClear (SSI0_BASE、SSI_RXFF|SSI_RXTO);

pui32DataTx = 0x00003005;

UARTprintf ("sent:\n ");

{UARTprintf ("'%c'"、pui32DataTx);

SSIDataPut (SSI0_BASE、pui32DataTx);


while (SSIBusy (SSI0_BASE))

IntEnable (INT_SSI0);

while (g_ulSSI2RXTO = 0)


UARTprintf ("\n 接收:\n ");

while (1)

{}

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

    您好 Nguyen、

    您将使用这些代码行来输出数据、  

    pui32DataTx = 0x00003005;
    
    SSIDataPut (SSI0_BASE、pui32DataTx); 

    但该器件配置为:

    SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_3、
    SSI_MODE_MASTER、2000000、8); 

    SSIDataPut 函数显示以下内容:

    //! 请注意、硬件会丢弃\ui32Data 的高32 - N 位、
    //! 其中 N 是 SSIConfigSetExpClk()配置的数据宽度。 对于
    //! 例如、如果接口配置为8位数据宽度、则上24
    //! 会丢弃\ui32Data 的位。 

    这意味着您不会输出提供给函数的完整数据。 尝试使用 TivaWare 外设示例中我们的 SPI_MASTER.c 文件中概述的缓冲区(我假设您将此用作基础、因为您的代码总体上非常匹配)。

    此外、我建议您在基本通信正常之前先中断。 这样、您就可以减少一个变量来处理、这可能会导致问题。 这里最好的方法是从确保您可以通过轮询发送和接收开始、然后在完成后添加中断。

    此外、还应确保您有一个示波器或逻辑状态分析器来查看 SSI 引脚并确保它们输出正确的数据。 这是找出 SPI 问题所在的最佳方法。

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

    作为供应商 Ralph "尝试"的出色代码转换(检测到32位值)和"消除 中断"(目前)的后续操作、提供了以下内容:

    [引用用户="Nguyen Thi Hai van "]我的对象正在将数据从 TM4C123GH6PM 传输到 MCP4921。[/引用]

    • TM4C123由3V3供电(  MCU 传输的任何"5V"电压)-(缺少所需的电平转换器) 证明是不可能的!
    • 未注明的是电源电压-应用于海报的"MCP4921"。   这可能证明 "至关重要"-如下图所示(如下所示)


    由于 MCU 的"SPI 输出"将在3V3左右达到"峰值"-并且 MCP4921要求最小值为"0.7 Vdd"(以"识别"逻辑高电平-即3V5 -由5V 电源供电时)-此"MCP 的5V 电源肯定会"导致问题"。   为防止这种情况发生、MCP4921应由 MCU 使用的(相同) 3V3供电。   (这进一步帮助确保两个 IC -加电/断电-一起...)

    如果示波器"卡中"(可用)不易/不快、海报( 暂时)会降低 SPI 数据速率- 使许多 LED (限流) 能够"确认  SPI 信号是否存在"。

    一如既往-海报(看起来)是通过(合理的)高级器件"学习 SPI"。    (确实违反 了"kiss!")   第一个或早期- SPI"掌握"-通过使用"小容量、基于 SPI、3V3供电、EEPROM、可以更好地实现。   使用复杂器件启动-极少(从不?) 收益不包括 (可预测) "疼痛和痛苦!"  (在用户和无电帮助器 crüe 时强制执行-无目的)

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

    感谢您的回应。我尝试使用接近的缓冲器、但运气不好。  

    这是 SSI 引脚的信号形式。 那么、您认为我的错误在哪里?

    #define NUM_SSI_DATA 2.

    void SSI0_Interrupt (void);

    uint32_t pui32DataTx[NUM_SSI_DATA];
    uint32_t pui32DataRx[NUM_SSI_DATA];
    uint32_t ui32Index;
    volatile unsigned long g_ulSSI2RXTO = 0;

    无效
    InitConsole (空)

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    GPIOPinConfigure (GPIO_PB0_U1RX);
    GPIOPinConfigure (GPIO_PB1_U1TX);

    SysCtlPeripheralEnable (SYSCTL_Periph_UART1);
    GPIOPinTypeUART (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);

    UARTConfigSetExpClk (UART1_base、SysCtlClockGet ()、115200、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));

    UARTEnable (UART1_BASE);

    内部
    main (空)

    SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHz);
    InitConsole();
    UARTprintf ("SSI ->\n");

    UARTprintf ("模式:SPI\n");
    UARTprintf ("数据:8位\n");

    SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
    SysCtlPeripheralEnable (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 (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_MODE_2、SSI_MODE_MASTER、20000、8);

    SSIEnable (SSI0_BASE);
    SSIIntEnable (SSI0_BASE、SSI_RXFF|SSI_RXTO);
    while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0]))



    SSIIntClear (SSI0_BASE、SSI_RXFF|SSI_RXTO);

    pui32DataTx[0]= 0x30;
    pui32DataTx[1]= 0x03;

    UARTprintf ("sent:\n ");


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

    UARTprintf ("'%c'"、pui32DataTx[ui32Index]);

    SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]);

    while (SSIBusy (SSI0_BASE))

    IntEnable (INT_SSI0);

    while (g_ulSSI2RXTO = 0)


    UARTprintf ("\n 接收:\n ");

    while (1)


    返回0;

    空 SSI0_Interrupt (空)

    uint32_t ui32Status;

    ui32Status=SSIIntStatus (SSI0_BASE、1);

    IF (ui32Status & SSI_RXFF|SSI_RXTO)

    G_ulSSI2RXTO++;

    // for (ui32Index=0;ui32Index < NUM_SSI_DATA;ui32Index++)

    SSIDataGet (SSI0_BASE、&pui32DataRx);


    SSIIntClear (SSI0_BASE、ui32Status);

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

    看起来根本不像 SPI 信号。 不确定您的示波器设置是否不正确、但如果您确定它们是否正常、我会说您没有获得任何输出。

    我再次建议现在删除中断功能、并确保您可以首先发送/接收轮询。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、我还想问、为什么将示波器设置为"50mV"–当有效 SPI 信号高电平必须超过2V (2000mV)时–"四十倍"海报的设置!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢大家的帮助。 是的、它似乎不传输任何数据。 我是开始者、您是否可以建议我使用检查是否具有 SPI 信号的方法? 提前感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Nguyen Thi Hai van "]您能否建议一种方法来检查我是否具有 SPI 信号[/引用]

    Ralph (现在也是我自己)所述、对示波器电容进行目视检查 检查 SPI 信号是否存在的一种"方法"。   您不会!   (使任何信号远程接近 SPI)

    此外-显示(仅一个) 4个 SPI 信号(正常)-不允许检测任何 "信号时序错误!"   (理想情况下、您希望显示所有4个信号-而不仅仅是一个)  、如果您(仅)有一个2通道示波器-这将要求您执行以下几种不同的示波器设置(和屏幕电容器)

    • SPI:CLK 和 FSS (或 GPIO 生成的 CS)
    • SPI: CLK 和 MOSI
    • SPI:CLK 和 MISO
    • SPI:MOSI 和 FSS (或 GPIO 生成的 CS)

    这揭示了4通道示波器的"优点"、但 示波器的带宽应大于"通道数"。   (有办法从2通道示波器"按摩" 4个通道-但带宽受到影响。)

    KISS 指示您在最初的 GPIO 输出模式下使用 MCU 的"基于 SPI 的引脚"。   如果空载、您应该注意快速(上升/下降)波形-和信号达到3V0以上。  (不是100mV 左右-您的示波器电容器先前已显示)   

    您可以通过编写简单的 GPIO 切换代码来帮助进行此类 GPIO 测试、该代码以0.3Hz - 1Hz 左右的频率运行。   (在这些缓慢的速率下-即使 DMM 也可以记录信号转换和电平)  一旦信号电平被确认-在所有4个"SPI 引脚"上(暂时设置为 GPIO) -只有这样、您才能将这4个相同的引脚重新配置为 SPI 模式-设置为较慢 的 SPI 数据速率

    还需要注意为 MCP4921供电的电压-这是之前要求的!    证明对您的最终成功至关重要...   (MCP 必须由3V3 ( 与 MCU 相同)供电、 并且"不是5V" 、这样才能"有机会"获得项目成功...)

     您可以"快速、轻松、增强"帮助者的工作 crüe (这是您的高目标-不是)-通过生成和提供(显然)上面的详细范围上限...   阿尔利斯!

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

    是的。 我已经为 MCP 3.3V 供电、但随后无法正常工作。

    根据您的建议、我为 SPI 显示2个通道示波器。 我没有得到任何东西。 我想我实际上在代码上出错了。 实际上、MCP 仅接收来自 TM4C123的信号、不发送任何信号。 如果我在 TM4C123代码中"注释掉"接收数据"部分并且仅通过 SPIDataPut 发送数据、这是否正常?  

    我更改了

     while (1)//(SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0]))

    pui32DataTx[0]= 0x3F;
    pui32DataTx[1]= 0xFF;

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

    UARTprintf ("'%c'"、pui32DataTx[ui32Index]);

    SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]);

    您知道我可能犯了什么错误吗?

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

    [引用用户="Nguyen Thi Hai van "]我已经为 MCP 3.3V 供电,但没有工作

    我的朋友-您对"无工作"的描述 是"接近于零"的值!    稍后-您会"澄清"、指出 "我没有得到任何东西。"   (尚不确定。)   

    这种"无"表示您能够查看  请求的4个示波器电容中的"根本没有信号"(即使是其中的一个信号)吗?   您是否确认示波器工作正常-尤其是它能够充分注意到电压范围内的信号?   (这一点都不清楚-也没有提供...)

    实际上、如果 MCP 不要求您处理或处理可能发送的任何数据、那么您(著名的) "发送和祈祷"方法(可能)会成功。  (仍然是-始终是-可疑的。)

    如果您"注释掉"SPIDataGet ()-将显示为"正常"-前提是 SPI RX 缓冲器不会"过度压。"   我使用此部件的频率不够高、无法(真正)知悉。

    仍然是 最令人担忧的问题、是 "为什么示波器看起来无法 (或被报告)显示 SPI 信号(或任何信号)、其电 压电平为3伏左右!    最好的办法是订购这4个 SPI 引脚进入 GPIO 输出模式-并切换每个引脚(大约1/2 Hz)-使用示波器进行探测-以确认是否存在3V 信号。  只有在实施并确认之后、您 才能返回 SPI。  

    这是过去的详细情况 -尚未报告-此时所有诊断均已死亡!    您必须提供所请求的有意义的数据-以便他人(有意义)帮助...

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

    谢谢大家! 最后、我的代码是有效的!

    #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"
    #define NUM_SSI_DATA 2.
    uint32_t pui32DataTx[NUM_SSI_DATA];
    char * pcChars ="SSI 主机发送数据。";
    int32_t i32Idx;
    int main (空)

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

    SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHz);
    //启用 SSI0外设
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);


    //
    //对于本示例,SSI0与 Porta[5:2]一起使用。 实际端口和引脚
    //您的器件上使用的可能不同、请参阅数据表以了解更多信息
    //信息。 GPIO 端口 A 需要启用、以便可以使用这些引脚。
    // TODO:将其更改为您正在使用的 GPIO 端口。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

    //
    //为端口 A2、A3、A4和 A5上的 SSI0功能配置引脚复用。
    //如果您的器件不支持引脚复用、则无需执行此步骤。
    // TODO:更改此选项以选择您正在使用的端口/引脚。
    //
    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);
    //
    //等待 SSI0模块准备就绪。
    //
    while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI0))


    //
    //配置 SSI。
    //
    SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_MASTER、2000000、16);
    //
    //启用 SSI 模块。
    //
    SSIEnable (SSI0_BASE);
    //
    //发送一些数据。
    //
    i32Idx = 0;
    pui32DataTx[0]= 0x3400;
    while (1)

    SSIDataPut (SSI0_BASE、pui32DataTx[0]);


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

    如果 您(至少某种程度上) 描述您为取得成功而改变的内容、是否"在这里帮助所有人"?   

    有这么多帖子-试图帮助您-事实证明、很难(现在)发现" 您改变和修复了什么!"   

    您对您的修复程序的识别-非常感谢- Mercî。

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

    是的、我同时使用示波器观察 CLK 和 MOSI 的信号。 我的代码中有一些错误、我已将其修复为前一条消息中的代码。

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

    感谢您的更新。   

    您可以简单地说、 "彩色高光"您的"代码修复"-同时(通过另一种颜色)高光照明 您的(之前)"代码错误?"  (如此处所示)

    密切了解您的代码和更改。    大多数新的读者-到达此主题-将 (遭受) "长时间而详细的搜寻"-没有(简单/宽松)高亮显示-此处建议...

    再次-很高兴您坚持并成功-您的"展示成功"将证明 是最有益的...