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:SSI 通信存在问题

Guru**** 2460850 points
Other Parts Discussed in Thread: TM4C123GH6PM, EK-TM4C123GXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/650778/tm4c123gh6pm-problem-with-ssi-communication

器件型号:TM4C123GH6PM
Thread 中讨论的其他器件: EK-TM4C123GXL

大家好、

我刚刚开始使用微控制器。 我使用的是 TM4C123GH6PM。

到目前为止、我还没有使用 SSI 通信、所以我编写了所附的代码、控制器通过两个 SSI 端口向自己发送消息。

我现在只通过下载 OT 中断来简化程序。

当我运行这个代码时、接收端口调用 ISR 并保存发送的数据、而不是再被调用一次、但是不写入任何数据、并且不再调用 ISR。

我缺少什么吗?

#include 
#include 
#include "inc/hw_memmap.h"
#include "inc/hw_ints.h"
#include "driverlib/debug.h"
#include "driverlib/ssi.h"
#include "driverlib/syscReceive.h"
#include "driverlib/gpin_map.h"




#include "driverlib_pin_map.h"
;#include "uintsbacer_e0_ints_deft = void 值32_intrabr.h;#define i20_int_int_ints_decrate.h =#include "uint_int_int_int_int_ints_ints_decrect.h = void 0_



SSIIntClear (SSI2_base、SSI_RXTO);
SSIDataGetNonBlocking (SSI2_base、&dataReceived [message_Index++]);
}


int main (void)
{
volatile uint32_t cycle_Counter = 0;

//启用 SSI1外设:
SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);
while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI1))
{
}

//启用 SSI2外设:
SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);
while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI2))
{
}

//
//对于本示例,SSI0与 Porta[5:2]一起使用。 实际端口和
//使用的引脚可能与您的器件不同、请参阅的数据表
//更多信息。 GPIO 端口 A 需要启用、以便这些引脚可以
//使用。
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);

//
//为 SSI 配置引脚
GPIOPinConfigure (GPIO_PD0_SSI1CLK);
GPIOPinConfigure (GPIO_PD1_SSI1FSS);
GPIOPinConfigure (GPIO_PD2_SSI1RX);
GPIOPinConfigure (GPIO_PD3_SSI1TX);

GPIOPinConfigure (GPIO_PB4_SSI2CLK);
GPIOPinConfigure (GPIO_PB5_SSI2FSS);
GPIOPinConfigure (GPIO_PB6_SSI2RX);
GPIOPinConfigure (GPIO_PB7_SSI2TX);

//
//配置 SSI 引脚的 GPIO 设置。
//查看每个引脚分配的函数。
//引脚分配如下:
// PB4 - SSI2CLK
// Pb5 - SSI2FSS
// Pb6 - SSI2RX
// Pb7 - SSI2TX
// PD0 - SSI1CLK
// PD1 - SSI1FSS
// PD2 - SSI1RX
// PD3 - SSI1TX
//
GPIOPinTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 |
GPIO_PIN_7);

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

//配置两个 SSI、1个作为主机、2个作为从机
SSIConfigSetExpClk (SSI1_base、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、50000、 8);
SSIConfigSetExpClk (SSI2_base、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_0、SSI_MODE_SLAVE、50000、 8);

//启用两个 SSI
SSIEnable (SSI1_base);
SSIEnable (SSI2_base);

//对于接收器端口,我们只允许超时中断,或完全/半满 FIFO 中断
SSIIntEnable (SSI2_base、SSI_RXTO);//
//IntEnable (INT_SSI1);
IntEnable (INT_SSI2);
IntMasterEnable();

//完成配置,现在主程序启动
while (1)
{
SSIDataPut (SSI1_base、++cycle_Counter);
SysCtlDelay (SysCtlClockGet ()/300);
}

返回0;
}

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

    [引用 user="Baruch Sheinenzon"]我是否遗漏了什么? [/报价]

    事实上、"是的"-当您注意到您的 MCU 时、您的控制板会保持安静。     通常情况下、除了 预期不佳之外、"定制电路板-设计/组装挑战"-您(假设)的"123 LPAD" 礼物、您会带有直接连接"PD0至 PB6"和"PD1至 PB7"的" 0Ω Ω 电阻器"(适当地称为"鼠疫-抗议者")。     这种情况(深思熟虑)出现在电路板原理图上的"小鼠型"中-许多/大多数人"错过了这一相当重要的"破坏性设计错误步骤"-在这里已得到长久认可-但允许/鼓励-继续...

    在这些条件下-您创建正确"信号路径"的能力存在严重疑问。    这再次证明了所有的猜测、因为没有提供电路板详细信息。

    由于您正在使用 MCU 进行"刚开始"、我建议您通过限制您对"中断"的使用来"延迟"深入探讨。     中断非常复杂-需要极大的"关注和处理"-并且证明有时会"过挑战(甚至经验)"。    您可以通过简单的轮询和/或延时时间来实现 SPI 目标、如果(仍然)您寻求此类挑战、则会在以后带来更高的复杂性。

    不知道你的控制板-和/或你"清除那些"整洁的"鼠疫-抗议者(继续"给予")-我没有对你的代码进行审查...

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

    您是否正在使用 EK-TM4C123GXL launchpad? 您是否移除了 R9和 R10? 默认情况下、PD0连接到 PB6、PD1连接到电路板上的 PB7。 原理图位于 http://www.ti.com/lit/ug/spmu296/spmu296.pdf 的第20页

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

    请注意、这种"模糊谨慎"的出现(效率极低)、因为它既未突出显示、也未着色、因此"伪装得很好"。

    包装那些"鼠疫-抗议者"(用小袋包装)-为"极少数"(可能)使用它们的人-肯定会"在悬崖上另一只柠檬!"

    没有一个、"您的行为"、但外部人士多年来一直发现并"对这种不明智的设计选择感到很不安"、更改为"没有任何解决办法!"

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

    好的、我已将其更改为 SSI0、根据用户指南、它是 GPIO、未连接到任何其他引脚。

    此外、在安全方面、我决定直接从主程序调用 Get 方法、而不使用中断。

    添加了延迟环路以及一个 while 环路、该环路会等待接收到一些新数据。

    while (1)
    {
    SSIDataPut (SSI0_BASE、++cycle_Counter);
    对于(DELAY_Counter = 0;DELAY_Counter < 1000000;DELAY_Counter++)
    {
    }
    while (!SSIDataGetNonBlocking (SSI2_base、&dataReceived [message_Index++]))
    {
    SSIDataPut (SSI0_BASE、CYCLICE_Counter);
    MESSAGE_Index--;
    
    }
    
    
    } 

    在第一个周期中、数据正确传输、但接收 SSI 不再接收数据。

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您停止接收数据时会发生什么情况? 主设备是否仍在传输数据(如果您使用范围进行检查)? CPU 是否卡在 ABORT 循环中的某个位置? 打开优化器后、除非将变量"delay_Counter"声明为"volatile"、否则您的软件延迟可能会被优化。 这可能导致最终发送队列消息的速度快于读取的速度、从而导致 MEAESE_Index 递减到超过数组开头的值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我将"delay_Counter"声明为易失性、我还可以看到延迟是通过反汇编窗口执行的。

    当我逐步运行程序时、我看到在 SSI_DR 寄存器中没有放置新数据(接收和发送)、甚至没有第一个字节。

    当我正常运行程序时、它会发送第一个字节、但不会发送其后的字节。

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

    [引用 user="Baruch Sheinenzon"]好的、我已将其更改为 SSI0

    改变 了什么?   您之前选择的两个 SPI 端口(端口"B"和 D")都受到这些0Ω Ω 电阻器的"困扰"。     因此、更改"一个端口"不会消除这些电阻器的"短路影响"!   您是否(现在)未将端口 A (SPI_0)连接到(两者)"Port B & D"(端口 B 和端口 D)-由那些令人愉快的(投射在混凝土中)"鼠疫-抗议者"提供?    

    建议您"拉动这些电阻器"-以便它们不再造成伤害...   您对进行(小)手术保持沉默...   (我会"墓碑"他们。  站起来-只焊接一根导线-提醒您已固定好 LPAD!)    实现后-您可以使用端口 B 和 D -正如您最初预期的那样...

    作为"kiss"的支持者-使用"最基本"SPI 函数是否对您(起始目的)不起作用-以便您至少可以建立"运行基准?"    我会使用"阻止函数"(SSIDataPut ()和 SSIDataGet () -因为我们不追求效率或优雅-我们只是希望您"实现 SPI 通信!"   (超出一个字符。)   

    遵循非常基本的代码-该代码应"超过"您(现有)的"一个字符传输/接收记录"。    (已实现、"下坡"...)  

    unsigned long ulDataTx[3];   //kiss 指示一个尽可能简单的开始-因此是硬代码。
    unsigned long ulDataRx[3];
    unsigned long ulindex;

    ulDataTx[0]="C";
    ulDataTx[1]='B';
    ulDataTx[2]='1';  //  OMG -这是一个整洁的"环"。

    // 使用“阻塞”Put 函数发送数据。   这会一直等到 TX FIFO 中有空间后再返回、从而确保所有数据都将//it 写入 TX FIFO。

    for (ulindex = 0;ulindex < 3;ulindex++)   // 硬代码是简单的理想选择-更改(之后)代码有效!


    SSIDataPut (SSI0_BASE、ulDataTx[ulindex]);


    //等待 SSI0完成传输发送 FIFO 中的所有数据。

    while (SSIBusy (SSI0_BASE))


    //使用“阻塞”GET 函数接收数据。    这会等待 RX FIFO 中有数据 后再返回。  

    for (ulindex = 0;ulindex < 3;ulindex++)


    SSIDataGet (SSI0_BASE、&ulDataRx[ulindex]);

    以上内容摘自更为复杂的代码-消费(多种)成人饮料后-但应证明"适合 Gov't 工作..."

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白了。 据我所知、这些缩短的引脚只能阻止我将这两个引脚用于两个不同的 IO 外设、这是不是真的? 因此、我对 SSI0使用端口 A 2-5、对 SSI2使用端口 b 4-7。
    总之、我添加了以下代码来解锁这些引脚(端口 D 也已启用):

    HWREG (GPIO_PORTD_BASE_GPIO_O_O_LOCK)= GPIO_LOCK_KEY;
    HWREG (GPIO_PORTD_BASE_GPIO_O_O_CR)|=(GPIO_PIN_7 | GPIO_PIN_6);

    仍然执行同样的操作、第一个字节被正确写入、那么既不接收也不发送任何内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Baruch Sheinenzon"]据我所知、这些缩短的引脚只会阻止我将这两个引脚用于两个不同的 IO 外设[/引用]

    我认为你是一个"过于乐观"的评估-这就是为什么。   B 和 D 号港口"在髋部连接"、直至您将那些"振振振振的人"移走!   任何信号-引入到/来自"PB6 & PB7"-均路由到 PD0/PD1。   这就引入了一个"不可接受"的风险因素、远远超出了不同外设的"诉求"。

    我之前介绍过非常详细的代码-但是您没有提供任何迹象表明您是否以任何形式使用过相同的代码-或者(甚至)完全使用过!    这种缺乏关键数据的情况----特别是在"漫长"(6天)之后-- --以及无法解释 的论坛缺失 ----不会导致"成功/启发、远程诊断..."    (确实-我们都很忙)

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

    [引用 USER="CB1_MOBILE"]

    我之前介绍过非常详细的代码、但您没有提供任何迹象表明您是否以任何形式使用过相同的代码、或者完全不使用!   这种缺少关键数据的情况-尤其是在"长期"论坛缺失之后-不会导致"成功的远程诊断..."

    [/报价]

    我之前曾尝试使用分块命令执行此操作、很抱歉、没有提到这一点。 然而,结果是相同的,只有第一个传输发生了这种情况。

    我想问是否可以在不删除"振振振振的人"的情况下使用 B 端口、只是为了确保我的想法正确。 我在使用较简单的 MCU 已有一段时间(基于8086)、但这种"振振振振型-抗议者"概念对我来说是一种新的概念。

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

    (大多数)在这里,通过缓慢/认真地工作,"加热和清除" R9/R10(又称"鼠疫-抗议者")并不是太困难。 "避免这种简单的努力"已使我们的客户足够多-因此我提供了(大量)直接相关经验的好处。

    您(现在-谢谢您)注意到使用了"阻止命令"、但避免直接提及"确切代码及其顺序、正如我之前提供的那样。" 需要注意细节-"单一、缺少分号"可能会启动"数百个代码错误"-因此有必要详细解释(然后预期)响应。

    再次-您是否按照我在这里提供的那样、以该代码(未更改的形式)部署了代码? 如果是、结果是什么(这些)?

    回想一下、我们很遥远-我的团队既不能触摸也看不到您的董事会/您的代码-我们完全依靠您的"详细描述流程"来代表您(和他人)提供(部分)服务和指导...

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

    [引用 USER="CB1_MOBILE"]

    再次-您是否按照我在这里提供的那样、以该代码(未更改的形式)部署了代码? 如果是、结果是什么(这些)?

    [/报价]

    我获取了您的代码、它工作正常、谢谢。

    我想、从技术上讲、我可以将其视为已解决、但我仍然无法确定我的代码出现了什么问题。

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

    [引用用户="Baruch Sheinenzon"]

    我获取了您的代码、它工作正常、谢谢。

    我想我可以从技术上将其视为已解决[/QUEST]

    好极了!   此认可-论坛协议规定、包含您问题的"解决方案"的帖子"标记!"   (通过"此帖子已解决我的问题"按钮-单击时、您 将"指向  此主题中提供的"工作代码列表帖子"(早期)。    

    完成后-如果您仍然保持好奇心-我会建议进一步"证明"-旨在"详细说明"...