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-TM4C1294XL:EK-TM4C1294XL、带 TFT 2.8 SPI 模块 ILI9341 LCD。 低 FPS

Guru**** 2539500 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/886853/ek-tm4c1294xl-ek-tm4c1294xl-with-tft-2-8-spi-module-ili9341-lcd-low-fps

器件型号:EK-TM4C1294XL

大家好。 我将 EK-TM4C1294XL 与 TFT 2.8 SPI 模块 ILI9341 LCD 配合使用(http://www.lcdwiki.com/2.8inch_SPI_Module_ILI9341_SKU:MSP2807)、遇到了一个问题:FPS 过低。

我正在 EK-TM4C1294XL 模块上使用 SYS-BIOS。 我创建了一个小 API、以便于使用 SPI

void SPI_Configuration ()
{
SPI_PARAMS_INIT (&SPI_Parameters);
SPI_Parameters.mode = SPI_MASTER;
SPI_Parameters.bitrate = 60000000;
SPI_Parameters.dataSize = 8;
SPI_Parameters.transferMode = SPI_MODE_BLOCKING;
SPI_H = SPI_OPEN (0、&SPI_Parameters);
如果(!SPI_H)
{
system_abort ("尝试配置模块\"SPI\"失败!");
}
}

unsigned char SPI_Send (unsigned char *数据_ ptr、unsigned int 数据_长度)
{
unsigned char 应答= 0x0;
SPI_Message_Data.count =数据长度;
SPI_Message_Data.txBuf = Data_ptr;
应答= SPI_TRANSFER (SPI_H、&SPI_Message_Data);
返回答案
;}

对于 LCD、我也创建了一个 API

void TFT_Send_Command (unsigned char Command)
{
GPIO_WRITE (TFT_DC、0);
SPI_Send (&Command、1);
}

void TFT_Send_parameter (unsigned char 参数)
{
GPIO_WRITE (TFT_DC、1);
SPI_Send (&parameter、1);
}

void TFT_Send_Word (无符号短字)
{
GPIO_WRITE (TFT_DC、1);
SPI_Send ((unsigned char*)&Word、2);
}

void TFT_Select_Workspace (TFT_Point_Structt Start_Point、TFT_Point_StructStop)
{
TFT_Send_Command (0x2A);
TFT_Send_Parameter ((Start_Point.X & 0xFF00)>> 8);
TFT_Send_Parameter (Start_Point.X & 0xFF);
TFT_Send_Parameter (((Stop_Point.X 和0xFF00)>> 8);
TFT_Send_Parameter (Stop_Point.X & 0xFF);

TFT_Send_Command (0x2B);
TFT_Send_Parameter ((Start_Point.Y & 0xFF00)>> 8);
TFT_Send_Parameter (Start_Point.Y & 0xFF);
TFT_Send_Parameter ((Stop_Point.Y & 0xFF00)>> 8);
TFT_Send_Parameter (Stop_Point.Y & 0xFF);
}

void TFT_Fill _All_Display (无符号短颜色)
{
int i = 0;
TFT_Select_Workspace (TFT_Start_Point、TFT_Stop_Point);
TFT_Send_Command (0x2C);
对于(I = 0;I < TFT_Resolution _X * TFT_Resolution _Y;I++)
{
TFT_Send_Word (颜色);
}
}

void TFT_Turn on (void)
{
TFT_Start_Point.X = 0;
TFT_Start_Point.Y = 0;
TFT_Stop_Point.X = 240;
TFT_Stop_Point.Y = 320;
GPIO_WRITE (TFT_LED_LIGHT、1);
GPIO_WRITE (TFT_RESET、0);
Task_sleep (150);
GPIO_WRITE (TFT_RESET、1);
Task_sleep (150);
TFT_Send_Command (0x11);
Task_sleep (150);
TFT_Send_Command (0x29);
Task_sleep (150);

//颜色格式
TFT_Send_Command (0x3A);
TFT_Send_Parameter (0x55);

//伽马3
TFT_Send_Command (0xF2);
TFT_Send_Parameter (0x00);

//伽马选择
TFT_Send_Command (0x26);
TFT_Send_Parameter (0x01);

//正电流
TFT_Send_Command (0xE0);
TFT_Send_Parameter (0x0F);
TFT_Send_Parameter (0x2A);
TFT_Send_Parameter (0x28);
TFT_Send_Parameter (0x08);
TFT_Send_Parameter (0x0E);
TFT_Send_Parameter (0x08);
TFT_Send_Parameter (0x54);
TFT_Send_Parameter (0xA9);
TFT_Send_Parameter (0x43);
TFT_Send_Parameter (0x0A);
TFT_Send_Parameter (0x0F);
TFT_Send_Parameter (0x00);
TFT_Send_Parameter (0x00);
TFT_Send_Parameter (0x00);
TFT_Send_Parameter (0x00);

//负伽马
TFT_Send_Command (0xE1);
TFT_Send_Parameter (0x00);
TFT_Send_Parameter (0x15);
TFT_Send_Parameter (0x17);
TFT_Send_Parameter (0x07);
TFT_Send_Parameter (0x11);
TFT_Send_Parameter (0x06);
TFT_Send_Parameter (0x2B);
TFT_Send_Parameter (0x56);
TFT_Send_Parameter (0x3C);
TFT_Send_Parameter (0x05);
TFT_Send_Parameter (0x10);
TFT_Send_Parameter (0x0F);
TFT_Send_Parameter (0x3F);
TFT_Send_Parameter (0x3F);
TFT_Send_Parameter (0x0F);
} 

在主任务中、我将配置 SPI 和 LCD、并在超循环中填充1种颜色

SPI_Configuration ();
TFT_TFT_TON_ON ();
while (1)
{
如果(i ==0)
{
TFT_FACK_ALL_Display (TFT_GET_color (0、0、0)));
}
如果(i = 1)则为其他值
{
TFT_FACK_ALL_Display (TFT_GET_color (255、0、0)));
}
如果(i == 2)则为其他值
{
TFT_FACK_ALL_Display (TFT_GET_color (0、255、0));
}
如果(i ==3)则为其他值
{
TFT_FACK_ALL_Display (TFT_GET_color (0、0、255));
}
I ==3? I = 0:i++;
} 

问题在于 LCD 在1.6秒内充满。 即我有0.6 FPS。 我不知道是什么问题(但 SPI 很好、它实际上是可配置的60 MHz。 我用示波器检查了这一点)。

我的代码中有问题,因为有些人在 Ard*ino 上的这个显示屏上达到了10个以上 FPS (证明: https://www.youtube.com/watch?v=WapdjBnF7tQ&t=0s)

我遇到了这个问题。 请帮帮我。

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

    您好!

    我的小组成员是否可以"赞扬你"、因为你的坚持和愿意与他人分享你的发展努力?   虽然您的工作表现很好-员工和我都"同样地"被您的"认证奖"授予您(高度)类似的原始职位。   (该问题“从未”得到正确解决,如果已经解决,则不需要此后续主题。)

    至您的"缓慢显示填充/更新"-您是否考虑过:

    • 识别代码中的位置、"吸收大部分代码执行时间?"
    • 然后尝试减少(理想情况下消除)任何不是真正"关键"的功能和/或机制。
    • 采用 TFT 的"SPI 模式"最能实现(潜在)"减少传输数量"和"其他 MCU 输出?"
    • 是否正确符合显示屏的时序规格?   (您的违规行为严重-可能影响或不影响更新速度-但从未如此出色!)
    • 使用 RTOS -尤其是当您应该努力时、"减少(潜在)延迟和复杂因素的数量"显然违反了"kiss!"   如前所述-最初绕过 RTOS 可简化和简化您的调查!   通过发现"没有 RTOS "达到的性能水平-您能够(稍后)清楚地注意到(任何/全部) RTOS 可能(即肯定) 施加...
    • 并仔细/批判性地观察所有"字符间"延迟(即每个 SPI 字符之间的延迟)。 或字传输)以查看"如果和如何"这些值可能会减少。

    让我们来处理每个输入(最简单的)反向序列。   ILI9341规格说明:

    您选择的"60MHz" SPI 时钟(SCL)-产生~16nS (总脉冲宽度)-严重低于(40 + 40) 80ns (总)-如上面所述。   违反规范是不明智的-虽然这可能"不"是您更新速度缓慢的(全部)原因-但必须避免!   (并可能表示"对细节缺乏关注"-这可能会导致(其他)规范违规和错误结论...)

    SPI 模式:我们无法判断选择了显示屏提供的两种 SPI 模式中的哪一种。   这需要您对4个"IM 位进行"配置"。   我们相信提供的"4位 SPI 模式"(如下所示)最能通过"16位"实现数据传输。   这种"更广泛的数据传输"最常会提高更新速率。

    减少/消除非关键(但重复)函数:每次通过循环"tf_fill_All_Display()"函数-它依次调用"tft Send Command()" ,导致 GPIO_write (TFt_DC, 0);-可能需要(不需要)这种函数!   (即、一旦 MCU "清除该位-它保持清零-它是否不清除?)   (一个例外(可能)是"该位必须切换"。 目前尚不清楚...)

    吸收大量程序执行时间的代码:"tf_fill_all_Display()."和该代码:"强制执行不必要的乘法"(i < tf_resolution_X * tf_resolution_Y;)-该(已知)结果应该(而不是)为"硬编码"。    更重要的是  ,"TFT_fill_All_Display()"对    "TFT_Send_Word( Color))"进行了多次重复的函数调用,这 进一步延迟了显示传输!   (实际上-延迟传输"76800个单次"(如果您使用16位 SPI 传输!)   该代码应在"tf_fill_all_Display( )"中移至 w/,这样可以避免 由(重复)函数调用引入的"添加的程序过标题和相关(大量重复)延迟"。

    请注意  ,"TFT_FLOAD_All_Display()"采用 了"TFT_GET_COLOR()",我们可以在其中找到"不在代码中列出!"   

    由于 SPI 活动的数量庞大-必须优化此"Fill _All"代码序列、以尝试"加快代码执行!"    

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

    大家好、CB1_MOBILE。

    关于 SPI 速度:

    我已查看此 LCD 的 STM32、Raspberry PI 和 Arduino 论坛 SPI 速度。 即使数据表中没有写入、60MHz 也是很好的。

    关于 RTOS:

    可能是它在减速。 但我将在项目中使用的这个 LCD 需要 RTOS。

    关于 TFT_FACK_All_Display 中的计算和函数调用:

    TivaC 具有120MHz。 你真的认为这会减慢她的速度吗? 我已经在没有任何额外操作(如 GPIO 写入和 TFT_Send_Word)的情况下检查了此函数。 结果相同。

    附注:我所讨论的视频中的这个人使用的是16 MHz Arduino。 因此、RTOS、exra 函数调用和 GPIO 写入不能使 TivaC 速度低于 Arduino

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

    RTOS 添加的潜在"负担"将"永远不会被发现"、因为您拒绝了我的建议。   我已要求您"从一开始"将其删除、以便可以测量其(真实)影响。   稍后-掌握了这种知识-您可以介绍它。   (在该过程中、几乎肯定是"缓慢屏幕更新"。)

    违反供应商规格绝不会好!   运行时、"超出规格"异常、不必要-甚至可能导致损坏!

    提供"许多"此类显示-有些是"非正式的!"   让您看到第二个显示屏-如果是-替换它。   更好的选择-从"不同来源"获取多个数据。

    对于您关于以下问题的断言、您提供"不支持":

    • 不必要的(因此延迟)函数调用
    • GPIO 写入(可能不需要)
    • 包含 RTOS -绝不允许供应商的 API 代码最大化更新速率

    您还没有透露每个 SPI 事务(即加法)上出现的多个"请求项目"(字符间/字间距(延迟))。

    "在此屏幕上生成"真实数据"有"更有效的方法"(而不是(仅)重复的颜色!   这意味着需要一个"可连接"的人。

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

    您可以进行测试、我可以看到这一点。

    正如我之前所说的、RTOS 会(并且很可能会)影响 LCD 的速度、但它并不完全很强、以至于我在120MHz MCU 上得到0.6帧/秒。 在任何情况下、我都不能拒绝使用 RTOS、因此我必须考虑其他问题。

    调用附加函数也不被考虑在内、因为上下文切换不会使 MCU 减慢这么多的速度。

    关于 GPIO:与调用其他函数相同。

    作为代码的基础、我使用了 LCD 开发人员提供的 Arduino 代码:

    e2e.ti.com/.../3201.lcd.c

    我想、SPI 配置或发送功能有什么问题。 可能是、我应该尝试使用 SPI 传输模式回调以15微秒的超时传输数据

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

    有(和有)个"不提问题"-只是一系列事实-每一个都提出了"为你带来价值"的尝试。

    当然,你是“自由拒绝他们”…… 并允许您的(超出 S L O W)屏幕更新继续...

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

    不、我接近解决方案。 现在、我将在1个 SPI 事务中发送512个字节。 现在、我得到了~5 FPS。 我想我有一种方法:在1个 SPI 事务中增加字节数量。 我应该使用 DMA 或增大 SPI TX 缓冲区大小(现在为512字节)。 您是否知道如何执行此操作?

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

    您好、Georgy、

    您是否通过增大 SPI 数据大小来实现此目的? 最大数据大小为16位。 此器件的 SPI 驱动程序已使用 DMA。 如前所述、您违反了 LCD 的供应商规格、无法保证预期行为。

    Jaskaran

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

    否、我增加 SPI 事务中的字节。 在我的函数 SPI_Send 参数 Data_Length 为2。 现在是512、即我将在1个 SPI 事务中发送512个字节

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

    Jaskaran,你说的很有趣 SPI 已使用 DMA? 您的同事不同意...
    https://e2e.ti.com/support/microcontrollers/other/f/908/t/887155

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

    Georgy、抱歉。  TM4C1294的 SPI 驱动程序确实使用 DMA。 Charles 提到的文章实际上表示不支持 SPI 四路模式、但它仍然使用 DMA。 我将更正该帖子。   您是否尝试增大 SPI 数据大小?

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

    Jaskaran、您是指那个字符串?

    SPI_Parameters.dataSize = 8; 

    是的、我是这样做的。  例如、如果我将设置 dataSize 16、则 LCD 将不起作用

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

    Jaskaran、我做到了。 现在我有(idk、40、可能是?) FPS。 更改1个 SPI 事务中的字节数并在60MHz 上设置 SPI 速度后、问题得到解决。 但1个问题没有得到解答。 如何 增加 SPI TX 缓冲区大小(现在是512字节、就像我之前的 SAD 一样)?

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

    您需要编辑在 SPI_Send 函数中设置的"SPI_Message_Data.count"。 它最多可设置为1024个数据帧、其中每个数据帧为8位或16位、具体取决于"SPI_Parameters.dataSize"设置为什么。

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

    是的、我已经更改了它。 适用于 dataSize 8位 最大为512。 如果我正在设置 513或更高的 SPI 刷新。

    问题是如何在不挤压 SPI 的情况下将512值更改为513或更高?

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

    您能否提供更多有关 SPI 刷新时发生的情况的信息? LCD 是否未响应或 LaunchPad 是否停止传输?

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

    这并不是任何人所关心的-但是"屏幕更新速度已经提高"、这是因为"减少了字符间延迟"-这是通过"增加每个 SPI 事务中的字节数(或字)"实现的。   如果(早得多的)建议得到采纳,这种情况本可以"更快/更容易地注意到"。   由于 MCU 的 SPI 时钟速率持续(未改变)、"仅"发生了(不需要的)延迟持续时间的减少(即"字符间延迟")!   (延迟是76,800次-因此"改进潜力"可能证明是"巨大的!")   并且(很容易)预测...

    [引用 USER="CB1_MOBILE]*仔细/批判地观察所有"字符间"延迟(即每个 SPI 字符之间的延迟)。 或字传输)、以查看"如果和如何"这些值可能会减少。[/quot]

    上述内容见3月8日的帖子@ 22:50 -第6个项目符号以及(详细)列表。   同样、严重违反了器件  (SCL)规范-打开了"未来和持续恐怖!"的大门   (这将在"早就"忘记规范违规之后出现...)

    出现对 ILI9341手册的检查、"不支持" 16位串行(SPI)事务。

    如所述(现在已多次)、需要注意(并遵守)"目标器件的数据表"(和规格)

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

    CB1_MOBILE、

    如果您知道如何减少 字符间延迟、请告诉我。 我全是耳朵

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

    这一点是否已经明确?   在 SPI 数据帧中增加 SPI 事务的数量具有"受欢迎"的副作用-显著减少"字符间"和(可能)其他 SPI 格式延迟...   

    您是否曾将 SPI 交易的范围限定为"任何/所有(字符间(或其他)延迟(间隔)"-这将明显地揭示...

    您可能会从中受益、因为"向显示屏发送(仅)单色"与您的任务(两者)是处理、获取和向显示屏显示"真实"(有意义)数据时大不相同(容易得多)!   正是在这一过程中、您的计划的"弱点"将(不幸)揭示...   (当然-降低您的更新速率...)

    下面显示的是一个"血氧仪"、它由我共同创建的一家过去的公司生产、它实际上拯救了"成千上万的生命!"   美国 "FDA"具有极其严格的技术标准。 "规则和法规"-和(从不)我的团队:违反技术规范和/或接受(随机)"您!"中的"技术指导"   所示的 LCD 具有要求严格的"更新速率"、并且我"与您共享"的许多技术使该医疗设备获得了巨大成功...

    您和其他人-采用我们提出的"更具条理和系统性的技术"-可能会及时实现(类似)奖励...   (挽救生命和财务...)

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

    您可能根本不理解要做一些复杂的事情、您需要从简单的事情开始吗? 简单颜色输出、复杂-有用数据的输出。 要输出有用的数据、我必须首先实现正常的 FPS、这是通过发送单一颜色实现的。

    您使用设备拯救了大量生命这一事实是很好的、我对此表示尊重、但至少向一个人讲述他们面临的问题并不是很好。

    您无法为 SPI 设置4位、因为 LCD 没有此选项。

    有关减少字符间延迟的问题。 我减小了它们。 问题是是否可以减少事务之间的暂停次数(它们是23 μ s)。通过优化代码无法减少暂停次数(我更改了测试的渲染功能、不像您所说的那样调用不必要的操作)。

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

    Georgy、您能否提供更多信息、了解当您将数据计数增加到512以上时、"SPI crames"会发生什么情况? LCD 是否停止响应或 LaunchPad 是否停止传输。

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

    抱歉、不是512字节。 513个字、即1026个字节。 如果我设置1027个字节的 SPI、它根本不发送任何数据。 仅噪声每个~1ms  

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

    Georgy、这是意料之中的事情、因为设备上的 DMA 控制器最多只能支持1024个数据帧的数据传输。根据数据表、LCD 只能处理8位数据大小、因此这是您可以从设备获取的最大数据、而不会增加数据大小。

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

    明白了。 但是、我可以通过某种方式减少 SPI 事务之间的暂停吗? 目前为23 μ C

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

    我唯一的想法是

    1.您是否正在编译应用程序以进行速度优化? 这可能会有所帮助。

    2.您可以编写自己的 SPI 驱动程序并使其成为零延迟中断。 内核将不会增加延迟。 。

    Todd

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

    感谢你的建议。 一般而言、我执行了以下操作:

    1) 1)将 SPI 设置为回调模式

    2) 2)创建了2个1024字节的缓冲区

    3)当我发送一个缓冲器时(其发送时间约为200微秒。 我用示波器进行了检查)、我忙于填充另一个缓冲器

    和... 这对我没有帮助。 当我在一个 SPI 事务中发送2个字节时、延迟约为23 μ s。 当我在一个 SPI 事务中发送1024字节时、延迟约为600 μ s。 我不知道问题是什么。 可能是我真的应该重写 SPI 驱动程序...

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

    谢谢 Todd

    问题得到解决。 我只需将优化设置为第1级、并将速度设置为5 lvl。 现在、我有24 fps。