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.

[参考译文] EK-TM4C129EXL:正向 SPI 帧

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/581801/ek-tm4c129exl-forward-spi-frame

器件型号:EK-TM4C129EXL

大家好、

在我的应用中、我想通过 SPI 将任意数量的 CPU 板连接在一起:

FSS 和 CLK 信号很常见

TX 和 Rx 从板连接到板

主板应发送数据。 每个板需要1个字节的帧。

我的问题是、是否可以发送任意大小的 SPI 帧? 如果我将帧大小设置为8位、第一个板每次都会得到它、但后面的任何人都不会获得任何有效数据。

此致、

Norbert

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

    是的、使用高级模式、启用保持帧。 除了使用 SSIAdvDataPutFrameEnd()发送的最后一个字节之外,您发送的所有 SSIDataPut()字节都是这样的。 要使数据从一个从器件传递到下一个从器件、需要读取接收到的数据、如果 FSS 未失效、则将其放入输出缓冲区、以便将其发送到下一个从器件。 这需要在主器件开始发送下一个字节之前完成。 我必须承认、我没有时间编写和验证该代码、但下面是初始化主设备(示例使用 SSI1)和从设备(示例使用 SSI3)的样子。

    #define master SSI1_base
    #define slave SSI3_base
    
    //将 SSI1初始化为主
    器件空 QSSIMasterInit (uint32_t SYSCLK_Freq、uint32_t baud _rate)
    {
    map_SysCtlPeripheralEnable (sysctl_Periph_SSI1);
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
    
    MAP_GPIOPinConfigure (GPIO_PB5_SSI1CLK);
    MAP_GPIOPinConfigure (GPIO_PB4_SSI1FSS);
    MAP_GPIOPinConfigure (GPIO_PE4_SSI1XDAT0);
    
    MAP_GPIOPinTypeSSI (GPIO_PORTB_AHB_BASE、GPIO_PIN_4 | GPIO_PIN_5);
    MAP_GPIOPinTypeSSI (GPIO_Porte AHB_BASE、GPIO_PIN_4);
    
    MAP_SSIConfigSetExpClk (主器件、SYSCLK_Freq、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、BAUD_RATE、 8);
    MAP_SSIEnable (主器件);
    SSIAdvModeSet (主器件、SSI_ADV_MODE_READ_WRITE);
    SSIAdvFrameHoldEnable (主器件);
    }
    
    //将 SSI3初始化为从
    器件空 QSSISlaveInit (uint32_t SYSCLK_Freq、uint32_t baud_rate)
    {
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_SSI3);
    MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOQ);
    
    MAP_GPIOPinConfigure (GPIO_PQ0_SSI3CLK);
    MAP_GPIOPinConfigure (GPIO_PQ1_SSI3FSS);
    MAP_GPIOPinConfigure (GPIO_PQ2_SSI3XDAT0);
    
    MAP_GPIOPinTypeSSI (GPIO_PORTQ_BASE、GPIO_PIN_0 | GPIO_PIN_1 |GPIO_PIN_2);
    
    MAP_SSIConfigSetExpClk (从器件、SYSCLK_Freq、SSI_FRF_MOTO_MOTO_0、SSI_MODE_SLAVE、BAUD_RATE、 8);
    MAP_SSIEnable (从器件);
    SSIAdvModeSet (从器件、SSI_ADV_MODE_READ_WRITE);
    SSIAdvFrameHoldEnable (从站);
    }
    

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

    您好!

    听起来很不错、但还有两件事提出来:

    1. 我正在寻找一种解决方案、在这种解决方案中、我不必考虑帧时序。 所以:您提到我必须在主器件发送新帧之前读出从器件中的数据并再次写入 FIFO、但我想避免这样一个软件"重定向"。
    2. 例如:SSI1 FSS 信号可以出现在多个引脚上(对于 TM4C123A、这些是 PF3、PD1):问题是:如果我将它们配置为 SSI1Fss 信号、它们是否连接"电气"?

    • 我是说、连接到一个引脚的主器件、
    • 主机启动帧发送、因此 FSS 发生了变化
    • 它是否也出现在另一个引脚上?

    此致、

    Norbert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1、抱歉、如果您只是保持计时、硬件不支持将移入移位寄存器的值自动移出。 DMA 可用于执行传输以避免 CPU 中断。
    2.如果同一信号被分配给两个不同的 GPIO 端口管脚、那么该信号被分配给编号最小的端口、而忽略编号较高的端口。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    从2)开始:似乎您现在尝试选择要获取数据的电路板、尽管您在第一个帖子中说 SSIFSS 将很常见-您可以通过将单独的引脚配置为 GPIO 引脚并用作 FSS 来实现这一点、 但这将是一场噩梦 -每个板一个引脚、未指定的数字和每个板一个发送/接收功能。 如果您使用138等外部解码器和额外的3个引脚来选择电路板、则要简单得多、FSS 可以是自动的 GPIO、也可以是单个发送/接收功能。

    此外、在这种情况下、更灵活的连接将是使用 UART、仅使用2个引脚和一个小位软件。 可通过第一个字节作为电路板地址、下一个字节作为数据来完成选择。

    根据电路板之间的距离、也可以使用 CAN 接口。