TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] CCS/TM4C123GH6PM:具有 Tiva 的 QVGA LCD 显示接口

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/671269/ccs-tm4c123gh6pm-qvga-lcd-display-interface-with-tiva

器件型号:TM4C123GH6PM

工具/软件:Code Composer Studio

大家好、我希望大家都做得很好。 我正在尝试将 QVGA TFT 显示屏与电路板连接。 我将使用 DRM 以及一些 API。 我已通过数据表中提到的相同步骤、 使用端口 A2、A3、A4、A5配置 SSI0模块。  

连接如下所示。

A2 (SCLK)进入 LCD 的时钟引脚

A3 (FSS)进入 LCD 的 CS (片选或从器件)

A4 (RX)进入 LCD 的 MISO

A5 (TX)进入 LCD 的 MOSI

(在 LCD 板上)直流引脚数据或命令选择我 不知道这是什么、我对这个引脚感到困惑。 我还记得、在课堂中 、主器件告诉我数据是 通过 MOSI 线路发送到从器件的、那么为什么这个数据引脚呢? 但是、我 已将其作为输出引脚包含在代码中。

( 在 LCD 板上)复位低电平有效

我还提到 一个关于同一主题的旧帖子,试图实施该帖子,但迄今为止我没有成功。   

显示屏上没有显示任何 内容、但是我正在尝试显示文本。 我们非常感谢您的帮助。 谢谢  

#include 
#include 
#include "driverlib/sysctl.h"
#include "tm4c123ghp6.h"
#include "driverlib/gpio.h"
#include "inc/hw_memmap.h"




// pA 2、3、4、5
void spi_ini (void){

SYSCTL_RCGCSSI_R = 0x01;//选择 SSI0模块 
SYSCTL_RCGC2_R = 0x01;//激活端口 A 的时钟
GPIO_PORta_AFSEL_R = 0x3C;//选择 PA 2、3、4、5以实现替代功能
GPIO_Porta_PCTL_R = 0x00222200;//使用相对端口配置 SSI
GPIO_Porta_DEN_R = 0x3C;//启用数字模式
GPIO_PORta_PUR_R= 0x3C;//上拉
SSI0_CR1_R= 0x00;//禁用 SSI
SSI0_CC_R=0x00;//使用主时钟
SSI0_CPSR_R=64;//选择时钟的分频值
SSI0_CR0_R=0x07;// 8位数据传输
SSI0_CR1_R=0x02;//启用 SSI SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);// PE4 = D/C'、PE5 =复位
GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、GPIO_PIN_4|GPIO_PIN_5);
GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_5、0x20);
SysCtlDelay (SysCtlClockGet ()/2);//延迟
GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_5、0);
SysCtlDelay (SysCtlClockGet ()/2); } void send_Byte (char data){ SSI0_DR_R=数据; while (SSI0_SR_R&0x01=0){}; } void send_str(char*buffer){ while (* buffer!=0){ send_Byte (*缓冲区); Buffer++; } } int main (void) { SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN); spi_ini(); send_str ("hello SPI"); }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Raza、
    我不知道为什么您使用直接寄存器模式。 使用经过验证的库例程不仅可以减少您的工作量、还可以减少出错的几率并提高获得帮助的可能性。 首先、您能否使用示波器查看 SSI 信号? 如果 SSITX、SSIFSS 和 SSICLK 正确无误、则表明您的软件正在执行您所请求的操作。

    您可能需要更深入地了解 QVGA 显示屏的文档。 我怀疑、它可能不仅仅需要通过 SPI 发送一个 ASCII 字符串、而是需要回答有关显示屏的问题、这超出了我的范围。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    器件型号:TM4C123GH6PM

    工具/软件:Code Composer Studio

    大家好、我正在尝试将 LCD 与电路板连接。 我已经修改了 SPI 文件夹中的一个示例、并使用了该示例进行了少量更改。 但是、我无法在 LCD 上看到任何文本。  

    我进行了如下连接、

    PA2 SCLK 进入 LCD 的时钟引脚

    PA3进入 LCD 的芯片选择

    PA4 Rx 引脚进入 LCD 的 MISO

    PA5 Tx 引脚进入 LCD 的 MOSI  

    复位低电平有效

    直流数据或命令选择、我不知道该引脚的功能、主器件传输的数据通过 MOSI 引脚传输、那么为什么选择该引脚。 我的代码如下所示。

    我们非常感谢您的帮助、我没有示波器来查看数据是否正在传输、因此、我无法确定问题是硬件还是软件。   

    #include 
    #include 
    #include "inc/hw_memmap.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/ssi.h"
    #include "driverlib/sysctl.h"
    #include "utils/uartdio.h"
    #include "utils/uartdio.h"
    
    
    //
    //! \addtogroup SSI_examples_list
    //! 

    SPI 主器件(SPI_MASTER)

    //! //! 此示例展示了如何将 SSI0配置为 SPI 主设备。 代码将 //! 在主 Tx 上发送三个字符、然后轮询接收 FIFO、直到 //! 在主 Rx 上接收3个字符。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - SSI0外设 //! - GPIO 端口 A 外设(用于 SSI0引脚) //! SSI0Clk - PA2 //! - SSI0Fss - PA3 //! - SSI0Rx - PA4 //! - SSI0Tx - PA5 //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 SSI0的运行不需要这些。 //! - UART0外设 //! - GPIO 端口 A 外设(用于 UART0引脚) //! - UART0RX - PA0 //! - UART0TX - PA1 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! -无。 //// ***************** // // //要发送和接收的字节数。 //// ***************** #define NUM_SSI_DATA 3 //************* // //在主 Freescale (SPI)模式下配置 SSI0。 此示例将发出 // 3个字节的数据,然后等待3个字节的数据进入。 这将全部由 //使用轮询方法完成。 //// ***************** int main (void) { #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) uint32_t ui32SysClock; #endif uint32_t pui32DataTx[NUM_SSI_DATA]; uint32_t pui32DataRx[NUM_SSI_DATA]; uint32_t ui32Index; // //将时钟设置为直接从外部晶振/振荡器运行。 // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值 板上的//晶体。 // #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC)、25000000); #else SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); #endif // //必须启用 SSI0外设才能使用。 // SysCtlPeripheralEnable (SYSCTL_Periph_SSI0); // //对于本示例,SSI0与 Porta[5:2]一起使用。 实际端口和引脚 //您的器件上使用的可能不同、请参阅数据表以了解更多信息 //信息。 GPIO 端口 A 需要启用、以便可以使用这些引脚。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);// PE4 = D/C'、PE5 =复位 GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、GPIO_PIN_4|GPIO_PIN_5); GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_5、0x20); SysCtlDelay (SysCtlClockGet ()/2);//延迟 GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_5、0); SysCtlDelay (SysCtlClockGet ()/2); GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_5、0x20); // //为端口 A2、A3、A4和 A5上的 SSI0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA2_SSI0CLK); GPIOPinConfigure (GPIO_PA3_SSI0FSS); GPIOPinConfigure (GPIO_PA4_SSI0RX); GPIOPinConfigure (GPIO_PA5_SSI0TX); // //配置 SSI 引脚的 GPIO 设置。 该函数也会提供 将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表 //查看每个引脚分配的函数。 //引脚分配如下: // PA5 - SSI0Tx // PA4 - SSI0Rx // PA3 - SSI0Fss // PA2 - SSI0CLK // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2); // //为 SPI 主控模式配置和启用 SSI 端口。 使用 SSI0、 //系统时钟电源,空闲时钟低电平和低电平有效时钟输入 //飞思卡尔 SPI 模式、主控模式、1MHz SSI 频率和8位数据。 //对于 SPI 模式,可以设置 SSI 时钟的极性 //单元空闲。 您还可以配置所需的时钟边沿 //在上捕获数据。 有关的更多信息、请参阅数据表 //不同的 SPI 模式。 // #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) SSIConfigSetExpClk (SSI0_BASE、ui32SysClock、SSI_FRF_MOTO_MODE_0、 SSI_MODE_MASTER、1000000、8); #else SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、 SSI_MODE_MASTER、1000000、8); #endif // //启用 SSI0模块。 // SSIEnable (SSI0_BASE); // //从 SSI 端口读取任何残留数据。 这将确保接收 // FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成 //因为 SPI SSI 模式为全双工模式,允许您发送和 //同时接收。 SSIDataGetNonBlocking 函数返回 //返回数据时为"true",未返回数据时为"false"。 //“非阻塞”函数检查接收中是否有数据 // FIFO、如果没有、则不会"挂起"。 // while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0])) { } // //初始化要发送的数据。 // pui32DataTx[0]="S"; pui32DataTx[1]='p'; pui32DataTx[2]='I'; // //发送3个字节的数据。 // for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++) { //使用“阻塞”Put 函数发送数据。 此函数 //将等待发送 FIFO 中有空间后再返回。 //这使您可以确保发送的所有数据都将其输入 //发送 FIFO。 // SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]); } // //等待 SSI0完成传输发送 FIFO 中的所有数据。 // while (SSIBusy (SSI0_BASE)) { } // //接收3个字节的数据。 // for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++) { // //使用“阻塞”GET 函数接收数据。 此函数 //将等待接收 FIFO 中有数据后再返回。 // SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]); // //由于我们使用的是8位数据,所以屏蔽 MSB。 // pui32DataRx[ui32Index]&= 0x00FF; } // //返回无错误 // 返回(0); }

      

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

    我已经启动了另一个线程、并通过 API 执行相同的操作、遇到了相同的问题。 您的专业知识在此是不需要的、再次感谢。  
    e2e.ti.com/.../2470386

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

    我已将您的主题与您今天上午发布的主题相同的帖子合并。 请避免在主题相同时重复主题、谢谢。

    Bob 提供了有关如何解决问题的建议。 如果您当前无法访问示波器、则需要通过某种方式访问示波器、 这是此类应用的基本调试工具、如果我们甚至无法验证您的信号是否正确输出、我们将无法提供大量建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Raza Haider">DC 数据或命令选择、我不知道这个引脚是什么、主器件传输的数据在 MOSI 引脚上传输、那么为什么这个引脚呢?  [/报价]

    D/C 引脚在" 向显示屏写入(或读取)数据"D" 与"向显示屏写入命令字节"C""之间进行了划分。   对这样一个"D/C 引脚"的需求是从20世纪80年代的显示屏上"转移"-(通常)使用 "8位数据和额外控制位"。  (通过"D/C"(如上所述) R/W、数据选通等进行控制)

    显示命令的示例包括:

    • 设置显示地址 (直接设置地址、而不是顺序设置)
    • 清除显示屏 (远较旧的 CRT "CLS"的模拟)
    •  重要显示初始化的某些(有时是所有)方面
    • 当然还有很多...  这可能有助于思考"任何显示交互-不是为了向显示屏添加新像素-因为(可能)处于"命令"下

    现在证明您不太可能自行开发此显示子系统。    此类 "商业产品" - 肯定有数据手册-和规范-  "保留规范/手册-或其链接"-使您的助手 crüe (此处)无法获得帮助您(更好)所需的关键信息。   (关于论坛心理的日期/时间、请参阅下面的"标签"。)

    减去示波器-您至少可以通过(暂时)将 SPI 端口转换为更简单的 GPIO 输出来验证您的连接和 MCU 的通用输出能力!   显然、显示屏将不起作用、但您可以使用 DMM 甚至限流 LED 来"验证 MCU 数据是否确实会到达 LCD 的输入引脚。   

    通过以低速率(例如1Hz)"切换"关键 MCU 引脚(在将每个 SPI 引脚切换至 GPIO 之后)-即使是"慢速仪表"或"不那么明亮" LED (注意"双尾数")也可以用作"一般诊断帮助"。

    快速/完整到达-或清晰链接-至您的显示屏手册/规格-"速度、易用、增强"您(未见、微爱)支持的有效性 crüe。   阿尔利斯!