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/TM4C1294NCPDT:TM4C1294NCPDT

Guru**** 2618835 points

Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/779553/ccs-tm4c1294ncpdt-tm4c1294ncpdt

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

工具/软件:Code Composer Studio

我有一个 TM4C129、它具有我尝试读取的传感器。 除了我在代码中使用的引脚之外、我无法读取任何其他引脚。 在下面的代码中、我不断读取 temp。 传感器。 我不需要向 MOSI 写入任何内容。 我要做的就是计时和从传感器读取数据。
但由于某种原因、我无法获取读数。 不确定我在代码中缺少什么内容。 我已检查其他示例(ti_master.c 等)与我的代码没有什么不同。 有什么想法我错过了什么?
谢谢。

uint32_t ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_OSC)、25000000);


void init_sensor (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI0))
;
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOA))
;

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOH))
;
GPIOPinTypeGPIOOutput (GPIO_Porth_BASE、GPIO_PIN_0);// CS 作为输出
GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_2);// CLK 作为输出
GPIOPinTypeGPIOInput (GPIO_Porta_base、GPIO_PIN_5);// MISO 作为输出
GPIOPinConfigure (GPIO_PA2_SSI0CLK);//CLK
GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);//MISO
GPIOPinTypeSSI (GPIO_Porta_base、
GPIO_PIN_5 | GPIO_PIN_2);
SSIConfigSetExpClk (SSI0_BASE、ui32SysClock、SSI_FRF_MOTO_MODE_3、
SSI_MODE_MASTER、
1000000、8);
SSIEnable (SSI0_BASE);
}


void read_sensor (void){
while (SSIBusy (SSI0_BASE))
;
SSIDataGet (SSI0_BASE、&dataRx[0]);

}



int main (void)
{
while (1){
read_sensor();
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 SPI 上、每次传输都是写入和读取。 由主器件启动的写入会生成写入从器件和从从器件读取的时钟。 同时、从器件从主器件读取数据并向主器件写入数据。 有时、您只需要一个操作、即写入或读取。 在这种情况下、其他数据是虚拟数据、可以忽略。

    要从从器件读取数据、TM4C 必须调用 SSIDataPut ()。 您可以提供虚拟数据。 用于启动从机的传输和时钟输出的数据将存储在 FIFO 中。 然后,对 SSIDataGet ()的调用将从 FIFO 中读取数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob、

    感谢您的澄清。 请参阅以下代码。 我仍然无法从 SPI 总线读取数据。 进行调试。 我在 ulDataRx 中看不到任何数据。 我缺少什么吗?

    谢谢。

    #define NUM_SSI_DATA 8
    
    uint32_t pui32DataTx[NUM_SSI_DATA];
    uint32_t pui32DataRx[NUM_SSI_DATA];
    uint32_t ui32SysClock;
    
    const unsigned char ulDataTx[NUM_SSI_DATA]={0x88、0xf8、0xf8、0x88、0x01、
    0x1f、0x1F、0x01};
    
    uint32_t ulDataRx[NUM_SSI_DATA]={0};
    
    //逐位反转数字。
    unsigned char Reverse (unsigned char ucNumber)
    {
    无符号短 ucIndex;
    无符号短整型 ReversedNumber = 0;
    for (ucIndex = 0;ucIndex < 8;ucIndex++)
    {
    ucReversedNumber = ucReversedNumber << 1;
    ucReversedNumber |=((1 << ucIndex)& ucNumber)>> ucIndex;
    }
    返回 ucReversedNumber;
    }
    
    
    int main (void){
    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、
    120000000);
    
    
    无符号长整型 ulindex;
    无符号长整型 ulData;
    
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    
    GPIOPinConfigure (GPIO_PD3_SSI2CLK);
    GPIOPinConfigure (GPIO_PD2_SSI2FSS);
    GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);
    GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);
    GPIOPinTypeSSI (GPIO_PORTD_BASE、
    GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1 | GPIO_PIN_0);
    SSIConfigSetExpClk (SSI2_base、ui32SysClock、SSI_FRF_MOTO_MOTO_MODE_0、
    SSI_MODE_MASTER、
    10000、16);
    SSIEnable (SSI2_base);
    
    while (1)
    {
    对于(ulindex = 0;ulindex < NUM_SSI_DATA;ulindex++)
    {
    ulData =(Reverse (ulDataTx[ulindex])<< 8)+(1 << ulindex);
    SSIDataPut (SSI2_base、ulData);
    }
    while (SSIBusy (SSI2_base))
    {
    }
    对于(ulindex = 0;ulindex < NUM_SSI_DATA;ulindex++)
    {
    SSIDataGet (SSI2_base、&ulDataRx[ulindex]);
    }
    }
    

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

    您是否使用示波器或逻辑分析仪检查了 PD0 (SSI2Tx)上的信号? 是否已将 PD0连接到 PD1 (SSI2Rx)?

    以下是可在 EK-TM4C1294XL Launchpad 上运行的示例项目。 它使用 SSI0。 要查看接收到的数据回送、请使用跳线将 PA4连接到 PA5。 使用 Code Composer Studio "File"->"Import"将该项目导入您的工作区。

    /cfs-file/__key/communityserver-discussions-components-files/908/5808.SPI_5F00_Master.zip

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

    感谢您的回答。 我能够使其与您的上述帖子协同工作。 现在、我必须更改规格。 我必须使用 GPIO_Porta_base。 我有4个从器件、必须使用具有 Porth 的0、1、2、3引脚的 CS/SS 线路。 请参阅以下代码。 我无法使 SYSCTL_PERIPH_GPIOH、GPIO_PIN_0正常工作。 我无法在 SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index])发送其阻止的任何数据; 我不确定我的行为是什么。 此外、为了更改 SS/CS、我需要在哪里将引脚置于低电平和高电平?
    最棒的

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOA))
    ;
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOH))
    ;
    
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI0))
    ;
    
    GPIOPinTypeGPIOOutput (SYSCTL_Periph_GPIOH、GPIO_PIN_0);// CS 作为输出
    GPIOPinTypeGPIOInput (GPIO_Porta_base、GPIO_PIN_5); // MISO 作为输入
    GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_4); // MOSI 作为输入
    GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_2);// CLK 作为输出
    
    GPIOPinTypeSSI (GPIO_Porta_base、
    GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2);
    
    SSIDisable (SSI0_BASE);
    SSIConfigSetExpClk (SSI0_BASE、ui32SysClock、SSI_FRF_MOTO_MODE_3、
    SSI_MODE_MASTER、
    1000000、8);
    SSIEnable (SSI0_BASE);
    
    while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0]))
    {
    }
    
    //
    //初始化要发送的数据。
    //
    pui32DataTx[0]= 1;
    pui32DataTx[1]= 2;
    pui32DataTx[2]= 3;
    
    //
    //发送3个字节的数据。
    //
    GPIOPinWrite (GPIO_Porth_BASE、GPIO_PIN_0、0x0);
    对于(ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)
    {
    //
    //使用“阻塞”Put 函数发送数据。 此函数
    //将等待发送 FIFO 中有空间后再返回。
    //这使您可以确保发送的所有数据都将其输入
    //发送 FIFOs.s
    //
    SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]);
    }
    
    while (SSIBusy (SSI0_BASE))
    {
    }
    
    对于(ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)
    {
    SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]);
    
    pui32DataRx[ui32Index]&= 0x00FF;
    }
    

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

    您是否正在尝试这样做?

     代码如下所示:

    #include 
    #include 
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/hw_ssi.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/ssi.h"
    
    
    
    
    #include "driverlib/sctl.h"#include "driverlib/usinuart/uarts.h"
    //
    //! \addtogroup 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 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! -无。 //// ***************** // // //要发送和接收的字节数。 //// ***************** #define NUM_SSI_DATA 4 #define sensor1 GPIO_PIN_0 #define SENSOR2 GPIO_PIN_1 #define SENSOR3 GPIO_PIN_2 #define Sensor4 GPIO_PIN_3 unsigned int writeReadSensor (unsigned int sensor、unsigned int size、unsigned int * buffer); //********* // //在主 Freescale (SPI)模式下配置 SSI0。 此示例将发出 // 3个字节的数据,然后等待3个字节的数据进入。 这将全部由 //使用轮询方法完成。 //// ***************** int main (void) { uint32_t ui32SysClock; uint32_t pui32DataSensor1[NUM_SSI_DATA]; uint32_t pui32DataSensor2[NUM_SSI_DATA]; uint32_t pui32DataSensor3[NUM_SSI_DATA]; uint32_t pui32DataSensor4[NUM_SSI_DATA]; ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC)、25000000); // //必须启用 SSI0外设才能使用。 // SysCtlPeripheralEnable (SYSCTL_Periph_SSI0); // //对于本示例,SSI0与 Porta[5:2]一起使用。 实际端口和引脚 //您的器件上使用的可能不同、请参阅数据表以了解更多信息 //信息。 GPIO 端口 A 需要启用、以便可以使用这些引脚。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); //使用 GPIOH 引脚进行手动芯片选择 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH); // //为端口 A2、A3、A4和 A5上的 SSI0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA2_SSI0CLK); GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);// TX GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);// RX // //配置 SSI 引脚的 GPIO 设置。 该函数也会提供 将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表 //查看每个引脚分配的函数。 //引脚分配如下: // PA5 - SSI0Rx // PA4 - SSI0Tx // PA2 - SSI0CLK // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_2); GPIOPinTypeGPIOOutput (GPIO_Porth_BASE、sensor1 | SENSOR2 | SENSOR3 | Sensor4); //从所有芯片选择高电平开始(无效) GPIOPinWrite (GPIO_Porth_BASE、(sensor1 | SENSOR2 | SENSOR3 | Sensor4)、0x0F); // //为 SPI 主控模式配置和启用 SSI 端口。 使用 SSI0、 //系统时钟电源,空闲时钟低电平和低电平有效时钟输入 //飞思卡尔 SPI 模式、主控模式、1MHz SSI 频率和8位数据。 //对于 SPI 模式,可以设置 SSI 时钟的极性 //单元空闲。 您还可以配置所需的时钟边沿 //在上捕获数据。 有关的更多信息、请参阅数据表 //不同的 SPI 模式。 // SSIConfigSetExpClk (SSI0_BASE、ui32SysClock、SSI_FRF_MOTO_MODE_0、 SSI_MODE_MASTER、1000000、8); // //启用 SSI0模块。 // SSIEnable (SSI0_BASE); // //从 SSI 端口读取任何残留数据。 这将确保接收 // FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成 //因为 SPI SSI 模式为全双工模式,允许您发送和 //同时接收。 SSIDataGetNonBlocking 函数返回 //返回数据时为"true",未返回数据时为"false"。 //“非阻塞”函数检查接收中是否有数据 // FIFO、如果没有、则不会"挂起"。 // while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataSensor1[0])) { } //向传感器2发送0xAA pui32DataSensor2[0]= 0xAA; writeReadSensor (SENSOR2、1、pui32DataSensor2); //从传感器2读取一个字节 writeReadSensor (SENSOR2、1、pui32DataSensor2); //从传感器3读取3个字节 writeReadSensor (SENSOR3、3、pui32DataSensor3); //从传感器4读取1个字节 writeReadSensor (Sensor4、1、pui32DataSensor4); //从传感器1读取1个字节 writeReadSensor (sensor1、1、pui32DataSensor1); //返回无错误 // return(0); } unsigned int writeReadSensor (unsigned int sensor、unsigned int size、unsigned int * buffer) { unsigned int i; if (size > NUM_SSI_DATA) { 大小= NUM_SSI_DATA; } GPIOPinWrite (GPIO_Porth_BASE、SENSOR、0);//芯片选择变为低电平 对于(i = 0;i < size;i++) { SSIDataPut (SSI0_BASE、buffer[i]);//从缓冲区发送 SSIDataGet (SSI0_BASE、&buffer[i]);//读取缓冲 区} GPIOPinWrite (GPIO_Porth_BASE、SENSOR、SENSOR);//芯片选择变为高电平 返回大小;//返回发送和接收的字节数 }

    该项目还附有:

    /cfs-file/__key/communityserver-discussions-components-files/908/SPI0_5F00_ManualCS.zip

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

    尊敬的 Bob:

    是的、 我的目的与您在上面发布的内容类似。 它提供了很多帮助。 是否可以只读取12位、并一次屏蔽它。 如何读取12位? 我可以这么做吗?

    SSIConfigSetExpClk (SSI0_BASE、ui32SysClock、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、1000000、 12); 

    此外、在数据表中、它说"

    对于传统主机模式、
    使用时、SYSCLK 或 ALTCLK 必须至少比 SSInClk 快两倍
    SSInClk 不能超过60MHz 的限制。"  如果我想按如下所示使用120MHz 时钟、我需要如何设置 SSInClk? 谢谢你

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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,如果您需要一次发送和接收12位,请将 SSIConfigExpClk()中的最后一个参数更改为12,如您所示。 要更改传输频率 SSInClk、请将第二个参数更改为最后一个参数。 在我的示例中、我使用的是1M 波特(1000000)。 您可以高达60M 波特、但请确保从器件和物理电路可以处理该高速。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你。