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.

[参考译文] 回复:RTOS/TM4C1294NCPDT:tm4c1294 SPI 环回 RTOS

Guru**** 2465890 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/664906/re-rtos-tm4c1294ncpdt-tm4c1294-spi-loopback-rtos

您好!

这就是问题所在。 谢谢你。 我一般都知道白色空间问题、但我对所有工作区都使用相同的位置、从未遇到过问题。  谢谢。

如果可能、我还有一个问题。 可用于串行通信(在用于 Tiva 的 RTOS 中)的 SPI 端口是 SPI2和 SPI3? 在头文件中找不到端口0或1的定义。 RTOS 驱动程序似乎使用端口0/1来为 FatFs 器件提供服务。 我认为这是正确的吗? 在非 FatFs 情况下、是否有方法使用 SP0 1?

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

    电路板文件设置为与 TI-RTOS 中的所有示例一起使用。 您可以根据需要进行更改。 例如、如果您不使用 FatFS、则只需删除代码(注:如果您不引用它、则不会将其拉入、但从视觉角度来看、删除它可能更清晰)。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这意味着我只能引用 EK_TM4C1294XL_SDSPI0? 但两者都不是定义为0?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是说我可以将 SDSPI 用作常规 SPI 吗? 那么我可以使用 SPI0/1。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。 删除 SDSPI 内容并在 EK_TM4C1294XL.h 中进行此更改
    typedef 枚举 EK_TM4C1294XL_SPIName{
    EK_TM4C1294XL_SPI0 = 0、
    EK_TM4C1294XL_SPI1、

    EK_TM4C1294XL_SPICOUNT
    }EK_TM4C1294XL_SPIName;

    以及下 EK_TM4C1294XL.c 中的 pinmux 代码
    /*
    *========================================= SPI ========================================================
    *
    相应的横幅
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢。 现在一切正常。 不过,我还有一个疑问:)

    我正在使用 SPI 从从器件读取数据。 从器件通过触发外部中断来标记已准备好提供数据的器件。 在中断中、我发布一个信号量来解锁 SPI_transmission。 当我以低带宽对其进行测试时、它工作正常。 最后、我的从器件以31.3kHz 的频率触发中断、我需要读取2个16位帧。 当我以该频率运行时、从器件触发信号和执行 SPI 任务之间的延迟开始过大。 在外部中断例程中、我只需切换一个引脚(仅供参考)并布置 SPI 信标。 在下面的示波器屏幕截图中、蓝色信号是一个参考信号、一旦代码跳转到 drdy ()例程、该信号就应该被切换、绿色信号是从器件的触发器(下降沿是 callign drdy ())。存在~4us 延迟。 当您查看紫色波形时、延迟甚至更大、紫色波形是 SPI 的信号之一(从器件使能信号)。  

    我正在使用两个任务和一个 Hwi。 一个任务没有 while ()循环,只会在请求时运行以配置从属设备(DAC_conf ())。  另一个任务 masterTaskFxn()是一个 SPI 传输任务。 我可以在 ROV 中看到、执行初始化后、第一个任务就会终止。 然后、只有 idle()、 masterTaskFxn()和 hwi 看起来是活跃的。 这种明显的延迟是由 RTOS 调度  程序本身引入的延迟造成的、还是我可以做得更好?

    void hardware_init (void)
    {
    
    // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    //启用计时器2
    //
    // Auxilaty SPI 引脚
    //
    GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_5);//初始化 PF4作为输入
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、32);//将 PF4作为输入
    GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_3);//初始化 PF4作为输入
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、8);//将 PF4作为输入
    GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_2);//初始化 PF4作为输入
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_3、4);//将 PF4作为输入
    }
    //
    *=== GPIO/DRDY HWI ===
    //
    void drdy (unsigned int index)
    //void drdy (void)
    {
    // semaphore_post (tcp_semaphore);
    GPIO_TOGGLE (Board_test);//将 PF4作为输入
    Semaphore_post (SPI_Semaphore);
    
    }
    
    /*
    ====== SPI 测量传输任务====
    //
    void masterTaskFxn (UARg arg0、UARg arg1)
    {
    SPI_Handle masterSpi;
    SPI_Transaction masterTransaction;
    SPI_Params spiParams;
    bool transferOK;
    
    SPI_Params_init (&spiParams);
    spiParams.transferMode = SPI_MODE_BLOCKING;
    spiParams.transferTimeout = SPI_WAIT_FOREVER;
    spiParams.transferCallbackFxn =空;
    spiParams.mode = SPI_MASTER;
    spiParams.bitrate = 5000000;
    spiParams.dataSize = 16;
    spiParams.frameFormat=SPI_POL1_PHA1;
    
    Semaphore_pend (SPI_Semaphore、BIOS_wait_forever);
    
    /*将 SPI 句柄初始化为默认主控*//
    masterSpi = SPI_open (0、&spiParams);
    masterSpi = SPI_open (Board_SPI0、&spiParams);
    masterTxBuffer2[0]=0b0001000000000;
    masterTxBuffer2[1]=0b0000000000000000;
    masterTxBuffer[0]= 0b00010010;
    
    /*启用中断*/
    GPIO_enableInt (Board_BUTTON0);
    
    while (1)
    {
    Semaphore_pend (SPI_Semaphore、BIOS_wait_forever);
    /*初始化主 SPI 事务结构*/
    ctr1=ctr1+1;
    masterTransaction.count = 1;//事务的帧数
    masterTransaction.txBuf =(ptr) masterTxBuffer;
    masterTransaction.rxBuf =(ptr) masterRxBuffer;
    /*启动 SPI 传输*/
    transferOK = SPI_transfer (masterSpi、&masterTransaction);
    
    }
    
    /*取消初始化 SPI */
    SPI_CLOSE (masterSpi);
    
    System_printf ("done");
    
    system_flush();
    }/*
    
    
    
    ==== 配置任务====
    */
    void DAC_conf (UArg0、UArg0 arg1)
    {
    
    SPI_Handle masterSpi_DAC;
    SPI_Transaction masterTransaction_DAC;
    SPI_Transaction masterTransaction_s2p;
    SPI_Transaction masterTransaction_ADC;
    SPI_Params spiParams_DAC;
    bool transferOK;
    
    SPI_Params_init (&spiParams_DAC);
    spiParams_dac.transferMode = SPI_MODE_BLOCKING;
    spiParams_dac.transferTimeout = SPI_WAIT_FOREVER;
    spiParams_dac.transferCallbackFxn =空;
    spiParams_dac.mode = SPI_MASTER;
    spiParams_dac.bitrate = 5000000;
    spiParams_dac.dataSize = 16;
    spiParams_dac.frameFormat=SPI_POL1_PHA1;
    
    // Semaphore_pend (SPI_Semaphore_DAC、BIOS_wait_forever);
    /*将 SPI 句柄初始化为默认主控*/
    masterSpi_DAC = SPI_open (0、&spiParams_DAC);
    // masterSpi = SPI_open (Board_SPI0、NULL);
    
    /*初始化主 SPI 事务结构*/
    masterTransaction_dac.count = 1;//事务的帧数
    masterTransaction_dac.txBuf =(ptr) dac_Buffer;
    masterTransaction_dac.rxBuf =(ptr) masterRxBuffer;
    
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_INT_PIN_5、0);//初始化 PF4作为输入
    /*启动 SPI 传输*/
    transferOK = SPI_transfer (masterSpi_DAC、&masterTransaction_DAC);
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_INT_PIN_5、32);//初始化 PF4作为输入
    DAC=1;
    
    // Semaphore_pend (SPI_Semaphore_DAC、BIOS_wait_forever);
    /*初始化主 SPI 事务结构*/
    masterTransaction_s2p.count = 1;//事务的帧数
    masterTransaction_s2p.txBuf =(ptr) S2P_Buffer;
    masterTransaction_s2p.rxBuf =(ptr) masterRxBuffer;
    
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_INT_PIN_3、0);//初始化 PF4作为输入
    /*启动 SPI 传输*/
    transferOK = SPI_transfer (masterSpi_DAC、&masterTransaction_s2p);
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_INT_PIN_3、8);//初始化 PF4作为输入
    DAC=2;
    
    // Semaphore_pend (SPI_Semaphore_DAC、BIOS_wait_forever);
    GPIOPinConfigure (GPIO_PD2_SSI2FSS);
    GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 |
    GPIO_PIN_2 | GPIO_PIN_3);
    
    masterTxBuffer[0]= 0b0100000100000001;
    /*初始化主 SPI 事务结构*/
    masterTransaction_adc.count = 1;//事务的帧数
    masterTransaction_adc.txBuf =(ptr) masterTxBuffer;
    masterTransaction_adc.rxBuf =(ptr) masterRxBuffer;
    transferOK = SPI_transfer (masterSpi_DAC、&masterTransaction_ADC);
    DAC=3;
    
    // Semaphore_pend (SPI_Semaphore_DAC、BIOS_wait_forever);
    masterTxBuffer[0]= 0b00001000;
    /*初始化主 SPI 事务结构*/
    masterTransaction_adc.count = 1;//事务的帧数
    masterTransaction_adc.txBuf =(ptr) masterTxBuffer;
    masterTransaction_adc.rxBuf =(ptr) masterRxBuffer;
    transferOK = SPI_transfer (masterSpi_DAC、&masterTransaction_ADC);
    DAC=4;
    
    /*取消初始化 SPI */
    SPI_Close (masterSpi_DAC);
    /*打开将在循环中发送测量值的新 SPI 连接*/
    Semaphore_post (SPI_Semaphore);
    /*启用中断*/
    GPIO_enableInt (Board_BUTTON0);
    // GPIOIntEnable (GPIO_PORTB_BASE、GPIO_PIN_4);
    
    if (transferOK){
    /*打印主接收缓冲区的内容*/
    System_printf ("配置完成\n");
    }
    否则{
    System_printf ("主 SPI 传输失败");
    }
    system_flush();
    }/*
    
    
    
    ==== main ====
    */
    int main (void)
    {
    
    /*构造 BIOS 对象*/
    Task_Params taskParams2;
    Task_Params 任务参数3;
    
    /*呼叫板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    Board_initSPI ();
    // Board_initEMAC ();
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_2);//初始化 PF4作为输入
    GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_2、4);//将 PF4作为输入//
    GPIOPinConfigure (GPIO_PD2_SSI2FSS);
    
    hardware_init();
    
    /*安装按钮回调*/
    GPIO_setCallback (Board_BUTTON0、drdy);
    
    ////启用中断*//
    GPIO_enableInt (Board_BUTTON0);
    
    
    //构造主线程*
    Task_Params_init (&taskParams2);
    taskParams2.priority = 2;
    taskParams2.STACKSIZE = TASKSTACKSIZE;
    taskParams2.stack =_task0Stack;
    Task_construction (&task0Struct,(Task_FuncPtr) masterTaskFxn、&taskParams2, NULL);
    //构造主 DAC 任务线程
    Task_Params_init (&taskParams3);
    taskParams3.priority = 1;
    taskParams3.STACKSIZE = TASKSTACKSIZE;
    taskParams3.stack =&task1stack;
    Task_construct(&task1Struct、(Task_FuncPtr) DAC_conf、&taskParams3、NULL);
    
    
    
    system_printf ("启动 TCP 回显示例\n 系统提供程序设置为"
    "SysMin。 停止目标以查看中的任何 SysMin 内容"
    " ROV.\n");
    /* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
    system_flush();
    
    /*启动 BIOS */
    BIOS_start();
    
    返回(0);
    }
    

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

    您似乎为此打开了另一个线程: e2e.ti.com/.../2445125

    让我们在这里解决您的问题、我希望我对它的答复就足够了:)。

    Todd