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:使用 Keil uVision 的 TM4C123GXL Launchpad -MCP4131 SPI 通信

Guru**** 2439710 points
Other Parts Discussed in Thread: TM4C123GH6PM, ENERGIA

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/621367/compiler-tm4c123gh6pm-tm4c123gxl-launchpad--mcp4131-spi-communication-using-keil-uvision

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

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

我尝试通过 SPI 将数字电位计 MCP4131与 Tiva TM4C123GXL LaunchPad 连接。 一个 LED 连接到 MCP4131的输出。 参考数据表和视频使用 Keil uvision5编写、编译和编程代码。 使用 DSO 进行检查时、SPI 引脚未提供任何信号。 代码如下所示。 请找出错误并设计解决方案。

#include
#include
#include "TM4C123GH6PM.h"



void SPI_MASTER_ini (void){
sysctl->RCGCSSI|=(1<<2);  
sysctl->RCGC2|=(1<1);  
GPIOB->AFSEL|=(1<<4)|(1<<6)|(1<<7);
GPIOB->AFSEL&=~(1<<5);
GPIOB->PCTL|=(2<<16)|(2<<20)|(2<<24)|(2<<28);
GPIOB->DEN|=(1<<4)|(1<<5)|(1<<6)|(1<<7);
GPIOB->DIR|=(1<<5);
GPIOB->PUR|=(1<<4)|(1<<5)|(1<<6)|(1<7);
SSI2->CR1&=(1<1);
SSI2->CR1=0x00000000;  
SSI2->CC=0x00;  
SSI2->CPSR=8;  
SSI2->CR0=(0x7<0);  
SSI2->CR1|=(1<<1);  


void SPI_write (uint8_t data){
SSI2->DR=数据;  
while ((SSI2->SR&(1<0)=0);  



int main(){

SystemInit();
SPI_MASTER_ini ();
GPIOB->DATA|=(1<<5);
GPIOB->DATA&=~(1<<5);
SPI_WRITE (0x00);
for (int j=0;j<128;j++)
SPI_WRITE (j);

for (int i=0;i<15;i++)
GPIOB->DATA|=(1<<5);
while (1)

GPIOB->DATA&=~(1<<5);
SPI_WRITE (0x00);//发送字符串
for (int j=0;j<128;j++)
SPI_WRITE (j);
for (int i=0;i<15;i++)
GPIOB->DATA|=(1<<5);

返回(0);

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

    您应该将 TivaWare 用于此应用。 请从 http://www.ti.com/tool/SW-TM4C 下载

    [安装路径]\TivaWare_C_Series-2.1.4.178\examples\peripherals\SSI 中提供了 SPI 示例
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试这种方法太早了...我在 SPI_MASTER.c 程序中进行了修改并尝试实现了接口...它仍然不起作用...您能建议我发布的代码为什么不起作用吗?

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

    首先、如果您需要支持、则应返回 TivaWare。

    其次、从基本 TivaWare 示例开始、看看您可以在 SPI 上验证通信。

    完成此操作后、请连接应用特定的器件并查看器件的数据表、以确保已配置 SPI。 如果您正确执行这些步骤、则应获得通信。 如果您没有、请发布您使用哪个示例测试的基线、并且您已使用 TivaWare 正确配置 SPI、然后列出为将器件连接到之前工作的示例以及源代码所做的更改。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ralph、
    感谢您的宝贵建议。 我将按照您的步骤返回给您..最初我无法获取任何示例的 SPI 信号.. Nyways 将再次尝试。 我能够在数字电位器和另一个电路板之间建立 SPI 通信。。所以我必须处理的是 Tiva 电路板代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我尝试在 Keil 和 Energia 中执行 SPI 代码。 根据 mcp4131的数据表、将向 POT 发送16位命令、以向抽头寄存器写入值。 分两步发送0x00和0x7E 来写入值126。 Tiva Launchpad 示例中的 SPI_Master.c 代码也被修改。 通信仍然无法正常工作。 使用 TM4C123电路板的 SPI 通信是否很难建立? 请提供合适的解决方案以建立通信

    //
    //
    // spi_master.c -演示如何在 SPI 主设备中配置 SSI0的示例
    // 模式。
    //
    //版权所有(c) 2010-2016 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    //以源代码和二进制形式重新分发和使用,有无
    //如果满足以下条件,则允许进行修改
    //满足:
    //
    //重新分发源代码必须保留上述版权
    //注意、此条件列表和以下免责声明。
    //
    //二进制形式的重新分发必须复制上述版权
    //注意、中的条件列表和以下免责声明
    //随提供的文档和/或其他材料
    //分布。
    //
    //德州仪器公司的名称和的名称都不是
    //其贡献者可用于认可或推广衍生产品
    //未经特定的事先书面许可,从该软件下载。
    //
    //本软件由版权所有者和作者提供
    //“原样”以及任何明示或暗示的保证,包括但不包括
    //限于对适销性和适用性的暗示保证
    //一个特定的目的是免责的。 在任何情况下、版权均不得
    //所有者或贡献者应对任何直接、间接、偶然、
    //特殊、典型或必然的损害(包括但不包括)
    //仅限于采购替代货物或服务;
    //数据或利润;或业务中断)
    //责任理论,无论是合同责任、严格责任还是侵权行为
    //(包括疏忽或其他)以任何方式因使用而产生
    //此软件,即使已被告知可能会发生此类损坏。
    //
    //这是 Tiva 固件开发包的版本2.1.3.156的一部分。
    //
    //

    #include
    #include
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.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"

    //
    //
    //! 添加到组 SSI_Examples_list
    //!

    SPI 主器件(SPI_MASTER)


    //!
    //! 此示例展示了如何将 SSI0配置为 SPI 主设备。 代码将会
    //! 在主 Tx 上发送三个字符、然后轮询接收 FIFO、直至
    //! 在主 Rx 上接收3个字符。
    //!
    //! 此示例使用以下外设和 I/O 信号。 您必须执行的操作
    //! 查看这些内容并根据您自己的董事会的需要进行更改:
    //! SSI0外设
    //! - GPIO 端口 A 外设(用于 SSI0引脚)
    //! SSI0Clk - PA2
    //! SSI0Fss - PA3
    //! SSI0Rx - PA4
    //! SSI0Tx - PA5
    //!
    //! 以下 UART 信号仅配置为显示控制台
    //! 消息。 SSI0的运行不需要这些。
    //! UART0外设
    //! - GPIO 端口 A 外设(用于 UART0引脚)
    //! - UART0RX - PA0
    //! - UART0TX - PA1
    //!
    //! 此示例使用以下中断处理程序。 来使用该示例
    //! 在您自己的应用程序中、您必须将这些中断处理程序添加到
    //! 矢量表。
    //! -无。
    //
    //

    //
    //
    //要发送和接收的字节数。
    //
    //
    //#define NUM_SSI_DATA 3.

    //
    //
    //此函数将 UART0设置为用于控制台显示信息
    //因为示例正在运行。
    //
    //
    无效
    InitConsole (空)

    //
    //启用用于 UART0引脚的 GPIO 端口 A。
    // TODO:将其更改为您正在使用的 GPIO 端口。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

    //
    //为端口 A0和 A1上的 UART0功能配置引脚复用。
    //如果您的器件不支持引脚复用、则无需执行此步骤。
    // TODO:更改此选项以选择您正在使用的端口/引脚。
    //
    GPIOPinConfigure (GPIO_PA0_U0RX);
    GPIOPinConfigure (GPIO_PA1_U0TX);

    //
    //启用 UART0以便我们可以配置时钟。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_UART0);

    //
    //使用内部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);


    //
    //
    //在主 Freescale (SPI)模式下配置 SSI0。 此示例将发出
    // 3个字节的数据,然后等待3个字节的数据进入。 这就是全部
    //使用轮询方法完成。
    //
    //
    int main (空)

    #if defined (target_IS_TM4C129_RA0)|| \
    已定义(TARGET_IS_TM4C129_RA1)|| \
    已定义(TARGET_IS_TM4C129_RA2)
    uint32_t ui32SysClock;
    #endif

    //
    //将时钟设置为直接从外部晶振/振荡器运行。
    // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
    板上的//晶体。
    //
    #if defined (target_IS_TM4C129_RA0)|| \
    已定义(TARGET_IS_TM4C129_RA1)|| \
    已定义(TARGET_IS_TM4C129_RA2)
    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_OSC)、25000000);
    其他
    SysCtlClockSet (SYSCTL_SYSDIV_20 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHz);
    #endif

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

    //
    //在控制台上显示设置。
    //
    UARTprintf ("SSI ->\n");
    UARTprintf ("模式:SPI\n");
    UARTprintf ("数据:8位\n");

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

    //
    //配置 SSI 引脚的 GPIO 设置。 该函数也会提供
    将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表
    //查看每个引脚分配的函数。
    //引脚分配如下:
    // PA5 - SSI0Tx
    // PA4 - SSI0Rx
    // PA3 - SSI0Fss
    // PA2 - SSI0CLK
    // TODO:更改此选项以选择您正在使用的端口/引脚。
    //
    GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |
    GPIO_PIN_2);

    //
    //为 SPI 主控模式配置和启用 SSI 端口。 使用 SSI0、
    //系统时钟电源,空闲时钟低电平和低电平有效时钟输入
    //飞思卡尔 SPI 模式、主控模式、1MHz SSI 频率和8位数据。
    //对于 SPI 模式,可以设置 SSI 时钟的极性
    //单元空闲。 您还可以配置所需的时钟边沿
    //在上捕获数据。 有关的更多信息、请参阅数据表
    //不同的 SPI 模式。
    //
    #if defined (target_IS_TM4C129_RA0)|| \
    已定义(TARGET_IS_TM4C129_RA1)|| \
    已定义(TARGET_IS_TM4C129_RA2)
    SSIConfigSetExpClk (SSI0_BASE、ui32SysClock、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_MASTER、1000000、8);
    其他
    SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_MASTER、1000000、8);
    #endif

    //
    //启用 SSI0模块。
    //
    SSIEnable (SSI0_BASE);

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

    ////
    ////初始化要发送的数据。
    ////
    // pui32DataTx[0]='s';
    // pui32DataTx[1]='p';
    // pui32DataTx[2]='I';

    ////
    //
    //发送3个字节的数据。
    //
    // for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)
    //{
    //
    //显示 SSI 正在传输的数据。
    //
    // UARTprintf ("'%c'"、pui32DataTx[ui32Index]);

    //
    //使用“阻塞”Put 函数发送数据。 此函数
    //将等待发送 FIFO 中有空间后再返回。
    //这使您可以确保发送的所有数据都将其输入
    //发送 FIFO。
    //
    SSIDataPut (SSI0_BASE、0x00);
    SSIDataPut (SSI0_BASE、0x7E);
    //}

    //
    //等待 SSI0完成传输发送 FIFO 中的所有数据。
    //
    while (SSIBusy (SSI0_BASE))



    //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]);
    //}

    //
    //返回无错误
    //
    返回(0);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您之前报告过、您的 DSO 未看到所选 SPI 引脚的输出。

    这种情况(仍然如此)吗? 缺少输出会导致 SPI_Clock 和 SPI_MOSI 以及 SPI_CS 吗? (此处为 FSS)

    如果您(是否)现在达到 SPI 输出-您是否已将 MCU 的 SPI 格式与从器件所需的格式"匹配"? 这对您的成功至关重要。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、SruMo、

    正如 CB1所说、我们不了解您的 SPI 通信的状态...

    [报价用户="Sruhmu">通信仍然无法正常工作。

    [/报价]

    好的、什么不起作用? 您是否得到任何字节? 您如何监控 SPI 线路? 您能否提供任何有关 SPI 线路当前发生的情况的示波器截图?

    在这里、我们真的没有太多工作要做的... 您发布的代码可能会在我们了解故障时有所帮助、但您需要更详细地描述确切的故障。

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

    如果可以的话、我们实际上不会从"UART 提供的额外监控功能"中受益。 (它在这里没有提供太多帮助-有吗?)

    UART 和 crüe 其他(无关)代码会"用更多数据来轰炸您的助手"、因此往往会在掩盖真实 SPI 代码的同时增加工作负载。    也不会为您带来好处-即使有激励的帮助者帮助。

    您必须(始终)意识到供应商(以及我们的外部人员)不能看到或接触您的系统-我们完全依赖您的沟通、"重要事实"、以便我们能够做出最佳的诊断。

    虽然"代码简洁性"很重要(即仅 MCU 设置和基本 SPI 代码部分... 我们真的不需要供应商的合法"锅炉板")相反、对于您的"叙述/描述"、您所做的确认工作-您所测量的方式和地点-都证明是至关重要的。   (同样、我们不是"站在您的一边"-我们依靠您的描述能力来提供帮助...)

    您之前注意到、您在与数字电位器通信的另一个 MCU 板上取得了"成功"。   未知的是"如何为您的"4C123板"和数字电位器供电?"   尝试传输时、远程设备是否接收到全功率/电压?  (真的吗?)   您是否已在4个 MCU SPI 引脚和4个从引脚之间实现"欧姆输出"连续性?  (真的吗?)

    如果有示波器可用、我们是否可以在您对从器件进行初始寻址期间看到 SPI 数据到达"从器件"?  (您是否确定了解"I2C 规定的7位寻址方案"-及其 TM4C 系列的实现?)   (尤其是 TM4C 系列!)   这就是示波器电容器如此重要的原因!   如果你"犯了"从属地址-你/拉尔夫和我可能在这里、"永远!"

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

    您好!
    通过使用来自 Energia 论坛的新 altSPI.h、在 Energia 中修改 mcp4131-TM4C123程序、我的问题得到了解决。 但是、我在上面发布的使用 Keil 编写的 SPI 程序完全不适合我。 我没有从逻辑分析仪上的 SPI 时钟、SPI_FSS 和 MOSI 中获取任何字节。 但是、现在我已经按照应用所需的方式实现了字节和时钟、并且在 Energia 中编写的新程序的帮助下成功连接了数字 POT。   谢谢你。