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 通信

Guru**** 2332530 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/599170/tm4c123gh6pm-spi-communication

器件型号:TM4C123GH6PM

您好!

我使用的是 TM4C123GH6PM 微控制器。 现在、我正在进行 SPI 通信。

我从应用数据表中获取参考代码。 我尝试读取单个能量计 IC (M90E32AS)寄存器。

该能量计 IC 将仅通过 SPI 进行通信。

我尝试读取一些寄存器值。 我无法获得这些寄存器的正确默认值。 我不确定我的软件是否正确。  

您能告诉我我我的程序是否正确读取这些寄存器?

计划:

#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_ssi.h"
#include "inc/hw_types.h"
#include "driverlib/ssi.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"

#define NUM_SSI_DATA 8.

const uint8_t pui8DataTx[NUM_SSI_DATA]={0x88、0xf8、0xf8、0x88、0x01、 0x1f、0x1F、0x01};

uint32_t REG_addr_H = 0x00000010;
uint32_t REG_addr_L = 0x0000000D;//地址值
uint32_t REG_DATA_H = 0x00000000;
uint32_t REG_DATA_L = 0x00000000;

uint32_t rec_addr_h = 0x00000000;
uint32_t rec_addr_L = 0x00000000;
uint32_t rec_data_h = 0x00000000;
uint32_t rec_data_L = 0x00000000;

//逐位反转数字。
//uint8_t 反向(uint8_t ui8Number)
//{
// uint8_t ui8Index;
// uint8_t ui8ReversedNumber = 0;
// for (ui8Index=0;ui8Index<8;ui8Index++)
//{
// ui8ReversedNumber = ui8ReversedNumber << 1;
// ui8ReversedNumber |=((1 << ui8Index)& ui8Number)>> ui8Index;
//}
//返回 ui8ReversedNumber;
//}


int main (空)

uint32_t ui32Index;
uint32_t ui32Data;
SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);

SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA5_SSI0TX);
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5|GPIO_PIN_3|GPIO_PIN_2);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);//针对该能量计 IC 中的 MODE 引脚
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、GPIO_PIN_1);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、GPIO_PIN_2);

SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、10000、 16);
SSIEnable (SSI0_BASE);

while (1)

/********* 主控 /

GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、0);

SSIDataPutNonBlocking (SSI0_BASE、REG_addr_H);
SSIDataGet (SSI0_BASE、&(rec_addr_H));
SysCtlDelay (100);

SSIDataPutNonBlocking (SSI0_BASE、REG_addr_L);
SSIDataGet (SSI0_BASE、&(rec_addr_L));
SysCtlDelay (100);

SSIDataPutNonBlocking (SSI0_BASE、REG_DATA_H);
SSIDataGet (SSI0_BASE、&(rec_data_H));
SysCtlDelay (100);

SSIDataPutNonBlocking (SSI0_BASE、REG_DATA_L);
SSIDataGet (SSI0_BASE、&(rec_data_L));

SysCtlDelay (100);

GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、GPIO_PIN_3);



我尝试读取该寄存器:0D。 默认值为13EC。 但我始终只获得 FFFF。

您能否验证我的代码、请告诉我此问题的解决方案。

此致

Arun Kumar.N

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Arun:
    我建议您首先参考下面的 SSI 示例 \examples\peripherals\SSI。

    在代码中、您未配置 RX 引脚、您将从中读取外部从器件。 我也不知道为什么要使用 GPIOPinWrite 来设置和清除 FSS 引脚。 FSS (或在飞思卡尔模式下的 CS)将在传输过程中由 SSI 模块自动控制。 您无需手动操作此引脚。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Charles Tsaaaa">我也不知道为什么要使用 GPIOPinWrite 来设置和清除 FSS 引脚。 [/报价]

    我不建议使用自动芯片选择。 GPIO 更简单、更可靠。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    众所周知、请注意使用:"永远、只有等"

    在 MCU 的 SPI 格式"匹配" SPI 从器件的要求-可避免手动芯片选择(可能)的情况下(当然罕见)...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    即使在 CB1这种情况下、我也不推荐它。

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

    您能告诉我我如何配置 RX 引脚、我希望从哪个从器件读取数据吗?
    因为、我提到过这一点。

    uint32_t REG_addr_H = 0x00000010; //从从从器件读取
    uint32_t REG_addr_L = 0x0000000D; //我要从哪个地址读取数据。

    它是正确的方式吗????? 如果不是、您能简单清楚地告诉我。 如果可能的话、请举例说明如何从从从器件读取数据。


    此致
    Arun Kumar.N
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Arun:
    请参阅 例如\examples\peripherals\SSI\SPI_MASTER.c。 您将需要按照如下所示配置 RX 引脚。
    GPIOPinConfigure (GPIO_PA4_SSI0RX);
    GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |GPIO_PIN_2);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    无 DMA 可供您使用!

    尊敬的、

    Dave

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

    [引用 user="SourceTwo "]没有适合您的 DMA!

    ;)

    芯片选择只是 DMA 设置的一部分。 模式所必需的所有功能。 如果设置/清除芯片选择的额外开销消除了 DMA 的优势、那么从 DMA 增加的复杂性开始就没有太多的用途了。

    Robert

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

    直到我未使用 DMA。 我在他们提到的数据表中使用的 IC (M90E32AS)在每次操作中、读取/写入都会使该芯片选择引脚处于低电平。 因此、这就是我使该引脚变为低电平和高电平的原因。

    主席先生、现在我也正确地使用了该读取引脚。 我将使用该代码、无论我在该示例中使用什么代码
    代码( \examples\peripherals\SSI\SPI_MASTER.c)

    我想从该 IC (M90E32AS)读取寄存器:0D。 为了读取该寄存器、此函数就足够了、或者我想进行任何其他更改
    进行编程。


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

    您好!

     不能、不能将 SPI_MASTER.c 原样用于与 M90E32A5连接。 spi_master.c 只是一个传输三个数据的环回示例。 我认为您需要仔细查看 M90E32A5数据表以了解接口要求。 要读取寄存器、MCU 需要生成32个 SCLK。 MCU SSI 一次只能发送16位数据。 这意味着您需要传输2x16位数据。 第一个16位数据将包含要从中读取的寄存器地址。 确保 SDI 的第一个位根据图为高电平、以指示它是读取操作。 在 MCU 的第二个16位上、它可以只是一个虚拟数据。 在操作结束时、您将收到两个16位数据、并且前16位不包含有用的信息、您可以忽略。 它是您接收到的第二个16位数据包含寄存器值。 请参阅 M90E32A5数据表。

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

    "接受任何传感器-然后(痛苦地)转移并发现(淘汰)和"仅那时"是否符合独特的外设要求-偏离 MCU 论坛的中心目的(太远)?

    您在这里提供协助的努力将得到"认可"、但它(必然)减少了(可用于解决的时间/努力)更多的"关键/关键"论坛援助问题。   (例如、提供多于最"基本"外设代码示例的示例...这些示例在许多(太多)年中"始终没有"更深入"的支持示例!)

    支持"每一个/每一个"传感器无疑是一个失败的提议!    一个更好的途径创建一种"通用解决方案方法"、它将海报引导至"它们(独特的外设接口)问题的本质"、同时避免熟练的供应商员工耗散、迫使阿法尔离开他们的正确的"MCU 甜点!"

    其中许多/大部分、"外部外设问题"应针对"外设供应商" (此处不是)-它们不应该?    相反-这个论坛(越来越多)是一个"倾倒场"、它被证明(就在这里-现在)是其最低效的使用...