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.

[参考译文] TM4C123GH6PGE:SPI 协议

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/571290/tm4c123gh6pge-spi-protocol

器件型号:TM4C123GH6PGE

你(们)好

我目前正在 tm4c123gh6pge 板中进行 SPI 通信,主要是...

我想使用     SPI 协议在 tm4c123gh6pge 微控制器中通信两个 SPI、一个 SPI0 (Tiva)用于主器件、另一个 SPI2 (Tiva)用于从器件。

是否可以使用 SPI 协议对两个 Tiva 进行通信。

使用

1.Tiva (主器件)   2.Tiva (从器件)

SPI0              SPI2

1,时钟--- > 克

2,MISO ---- >  MISO

3.MOSI ---- >  MOSI

4.SS---  > SS

我编写的代码是..

SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHz);

SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);

GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0RX);
GPIOPinConfigure (GPIO_PA5_SSI0TX);


GPIOPinConfigure (GPIO_PB4_SSI2CLK);
GPIOPinConfigure (GPIO_PB5_SSI2FSS);
GPIOPinConfigure (GPIO_PH6_SSI2RX);
GPIOPinConfigure (GPIO_pH2_SSI2TX);

GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 |GPIO_PIN_3 |
GPIO_PIN_2);

GPIOPinTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_4 |GPIO_PIN_5);
GPIOPinTypeSSI (GPIO_Porth_BASE、GPIO_PIN_6 |GPIO_PIN_7);

SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、
SSI_MODE_MASTER、1000000、8);


SSIConfigSetExpClk (SSI2_base、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_MODE_0、
SSI_MODE_MASTER、1000000、8);

SSIEnable (SSI0_BASE);
SSIEnable (SSI2_base);

while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0]))

while (SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0]))


pui32DataTx[0]="S";
pui32DataTx[1]='p';
pui32DataTx[2]='I';


UARTprintf ("sent:\n ");


while (1)

SPI_protocol ();

void SPI_protocol ()

ASD+;

for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)

UARTprintf ("'%c'"、pui32DataTx[ui32Index]);
UARTprintf ("\NTX:\n ");

SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]);


while (SSIBusy (SSI0_BASE))


asd1++;
for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)

SSIDataGet (SSI2_base、&pui32DataRx[ui32Index]);


pui32DataRx[ui32Index]&= 0x00FF;

UARTprintf ("\nRx:\n ");

UARTprintf ("'%c'"、pui32DataRx[ui32Index]);

while (SSIBusy (SSI2_base))



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    以上代码不起作用、请提供正确的信息
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好 Ravi

    也请搜索论坛。 1月份在论坛上发布了类似的代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Ravi Kumar"]

    2,MISO ---- >  MISO

    3.MOSI ---- >  MOSI

    [/报价]

    您是否确实将一侧连接到另一侧? 从一侧向外到另一侧的输出?

    布鲁诺

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

    好的,Amit 先生 ,我可以检查你以前给我的代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Burno Saraiva 先生,
    我确实将 MISO 连接到 MISO、将 MOSI 连接到 MOSI、但它不起作用。但有一次我可以再次检查连接和编程。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ravi、

    名称可能会有点混淆、但让我尝试解释一下。

    简而言之、您需要将 MISO 连接到 MOSI、另一条线路是 MOSI 连接到 MISO。 您的连接错误。

    MISO 表示"主从器件出"、这些词可能会引起混淆。 如果您认为:

    "矿物输入、他人的输出"。 无论如何、一个 TM4的输出应连接到另一个 TM4的输入。

    但是:
    您确定 SPI 是满足您需求的最佳通信解决方案吗?
    如果只使用 UART 交换数据、则有一些优势:
    -编程更简单
    -无需将一端配置为主设备,将另一端配置为从设备,您可以从两端开始通信
    -只需要两条信号线(Tx->Rx 和 Rx<- Tx),当然还有一个公共 GND
    非常可靠的通信,可以在一秒内轻松传输100000个字节。 如果您的线路较短、可能会增加一倍。

    在我公司涉及两个 MCU 的第一个项目中、我们设计了 SPI 板。 制造软件以允许从任一端开始通信是一件混乱的事情... 我们了解了详细信息、今天我们只需使用"Good old UART"即可。

    祝你一切顺利

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

    我已经解决了,但它不起作用,请告诉我原因。 代码是

    SPI0 SPI1.

    1.Clk---------- >克

    2.MISO ---- > MISO . > 我建立的连接

    3.MOSI ---- > MOSI

    4.SS--- > SS

    SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);


    GPIOPinConfigure (GPIO_PA2_SSI0CLK);
    GPIOPinConfigure (GPIO_PA3_SSI0FSS);
    GPIOPinConfigure (GPIO_PA4_SSI0RX);
    GPIOPinConfigure (GPIO_PA5_SSI0TX);


    GPIOPinConfigure (GPIO_PD0_SSI1CLK);
    GPIOPinConfigure (GPIO_PD1_SSI1FSS);
    GPIOPinConfigure (GPIO_PD2_SSI1RX);
    GPIOPinConfigure (GPIO_PD3_SSI1TX);

    GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 |GPIO_PIN_3 |
    GPIO_PIN_2);

    GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 |GPIO_PIN_2 |
    GPIO_PIN_3);

    SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_MASTER、1000000、8);


    SSIConfigSetExpClk (SSI1_base、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_MODE_0、
    SSI_MODE_MASTER、1000000、8);

    SSIEnable (SSI0_BASE);
    SSIEnable (SSI1_base);

    //while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0]))
    //{
    //}

    while (SSIDataGetNonBlocking (SSI1_base、&pui32SlaveRx[0]))



    UARTprintf ("\n\nClear SSI0和 SSI1 FIFO。\n"\});

    for (ui32Index = 0;ui32Index < 8;ui32Index++)

    ui32DummyWrite = dummy_char;
    UARTprintf ("TX 主设备:'%c'\n"、ui32DummyWrite);
    SSIDataPut (SSI0_BASE、ui32DummyWrite);


    while (SSIBusy (SSI0_BASE))



    while (SSIDataGetNonBlocking (SSI1_base、\ui32Trash))

    ui32废物桶&= 0x00FF;
    UARTprintf ("RX 从站(回收站):'%c'\n"、ui32Trash);


    while (SSIDataGetNonBlocking (SSI0_BASE、\ui32Trash))

    ui32废物桶&= 0x00FF;
    UARTprintf ("RX 主设备(回收站):'%c'\n"、ui32Trash);




    UARTprintf ("SSI 0和 SSI1已清除。\n\n");


    while (1)

    UARTprintf ("\n***开始***\n");
    UARTprintf ("\n 主 TX ->从 RX);

    pui32MasterTx[0]="S";
    pui32MasterTx[1]="p";
    pui32MasterTx[2]='i';

    for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++) 它正在工作................ 好的

    UARTprintf ("TX 主站(数据):'%c'\n"、pui32MasterTx[ui32Index]);
    SSIDataPut (SSI0_BASE、pui32MasterTx[ui32Index]);


    while (SSIBusy (SSI0_BASE))



    UARTprintf ("\n");

    for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)

    asd1++;
    SSIDataGet (SSI1_base、&pui32SlaveRx[ui32Index]);---- > 它不工作。
    ASD+; 在该位置、控制器被敲击或挂起
    pui32SlaveRx[ui32Index]&= 0x00FF;
    UARTprintf ("RX 从设备(数据):'%c'\n"、pui32SlaveRx[ui32Index]);






    终端的输出为..........................

    清除 SSI0和 SSI1 FIFO。

    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    SSI 0和 SSI1清零。


    ***开始***

    主器件 TX -->从器件 RX

    TX 主设备(数据):"S"
    TX 主设备(数据):"P"
    TX 主设备(数据):"I"

    在此位置,控制器被击中或挂起,即 SSIDataGet (SSI1_base,&pui32SlaveRx[ui32Index]);。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Amit 先生:

    我已经解决了,但它不起作用,请告诉我原因。 代码是

    SPI0 SPI1

    1.Clk---------- >克

    2.MISO ---- > MISO ........ >我建立的连接

    3.MOSI ---- > MOSI

    4.SS--- > SS

    SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);


    GPIOPinConfigure (GPIO_PA2_SSI0CLK);
    GPIOPinConfigure (GPIO_PA3_SSI0FSS);
    GPIOPinConfigure (GPIO_PA4_SSI0RX);
    GPIOPinConfigure (GPIO_PA5_SSI0TX);


    GPIOPinConfigure (GPIO_PD0_SSI1CLK);
    GPIOPinConfigure (GPIO_PD1_SSI1FSS);
    GPIOPinConfigure (GPIO_PD2_SSI1RX);
    GPIOPinConfigure (GPIO_PD3_SSI1TX);

    GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 |GPIO_PIN_3 |
    GPIO_PIN_2);

    GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 |GPIO_PIN_2 |
    GPIO_PIN_3);

    SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_MASTER、1000000、8);


    SSIConfigSetExpClk (SSI1_base、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_MODE_0、
    SSI_MODE_MASTER、1000000、8);

    SSIEnable (SSI0_BASE);
    SSIEnable (SSI1_base);

    //while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0]))
    //{
    //}

    while (SSIDataGetNonBlocking (SSI1_base、&pui32SlaveRx[0]))



    UARTprintf ("\n\nClear SSI0和 SSI1 FIFO。\n"\});

    for (ui32Index = 0;ui32Index < 8;ui32Index++)

    ui32DummyWrite = dummy_char;
    UARTprintf ("TX 主设备:'%c'\n"、ui32DummyWrite);
    SSIDataPut (SSI0_BASE、ui32DummyWrite);


    while (SSIBusy (SSI0_BASE))



    while (SSIDataGetNonBlocking (SSI1_base、\ui32Trash))

    ui32废物桶&= 0x00FF;
    UARTprintf ("RX 从站(回收站):'%c'\n"、ui32Trash);


    while (SSIDataGetNonBlocking (SSI0_BASE、\ui32Trash))

    ui32废物桶&= 0x00FF;
    UARTprintf ("RX 主设备(回收站):'%c'\n"、ui32Trash);




    UARTprintf ("SSI 0和 SSI1已清除。\n\n");


    while (1)

    UARTprintf ("\n***开始***\n");
    UARTprintf ("\n 主 TX ->从 RX);

    pui32MasterTx[0]="S";
    pui32MasterTx[1]="p";
    pui32MasterTx[2]='i';

    对于(ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++),它正在工作.................. 好的

    UARTprintf ("TX 主站(数据):'%c'\n"、pui32MasterTx[ui32Index]);
    SSIDataPut (SSI0_BASE、pui32MasterTx[ui32Index]);


    while (SSIBusy (SSI0_BASE))



    UARTprintf ("\n");

    for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)

    asd1++;
    SSIDataGet (SSI1_base、&pui32SlaveRx[ui32Index]);---- >不起作用。
    ASD+;在此位置、控制器被敲击或挂起
    pui32SlaveRx[ui32Index]&= 0x00FF;
    UARTprintf ("RX 从设备(数据):'%c'\n"、pui32SlaveRx[ui32Index]);






    终端的输出为..........................

    清除 SSI0和 SSI1 FIFO。

    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    TX 主控:"D"
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    RX 主机(垃圾箱):""
    SSI 0和 SSI1清零。


    ***开始***

    主器件 TX -->从器件 RX

    TX 主设备(数据):"S"
    TX 主设备(数据):"P"
    TX 主设备(数据):"I"

    在此位置,控制器被击中或挂起,即 SSIDataGet (SSI1_base,&pui32SlaveRx[ui32Index]);。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好 Ravi

    您是否查看了论坛上其他人的评论、即 MISO 与 MISO 有关。 这是 TM4C 上的错误措辞、根据数据表、引脚被称为 TX 和 RX。 因此、您需要将主器件 TX 连接到从器件 RX (即 MISO 连接到 MOSI)