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.
工具/软件: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"); }
器件型号: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
[引用 USER="Raza Haider">DC 数据或命令选择、我不知道这个引脚是什么、主器件传输的数据在 MOSI 引脚上传输、那么为什么这个引脚呢? [/报价]
D/C 引脚在" 向显示屏写入(或读取)数据"D" 与"向显示屏写入命令字节"C""之间进行了划分。 对这样一个"D/C 引脚"的需求是从20世纪80年代的显示屏上"转移"-(通常)使用 "8位数据和额外控制位"。 (通过"D/C"(如上所述) R/W、数据选通等进行控制)
显示命令的示例包括:
现在证明您不太可能自行开发此显示子系统。 此类 "商业产品" - 肯定有数据手册-和规范- "保留规范/手册-或其链接"-使您的助手 crüe (此处)无法获得帮助您(更好)所需的关键信息。 (关于论坛心理的日期/时间、请参阅下面的"标签"。)
减去示波器-您至少可以通过(暂时)将 SPI 端口转换为更简单的 GPIO 输出来验证您的连接和 MCU 的通用输出能力! 显然、显示屏将不起作用、但您可以使用 DMM 甚至限流 LED 来"验证 MCU 数据是否确实会到达 LCD 的输入引脚。
通过以低速率(例如1Hz)"切换"关键 MCU 引脚(在将每个 SPI 引脚切换至 GPIO 之后)-即使是"慢速仪表"或"不那么明亮" LED (注意"双尾数")也可以用作"一般诊断帮助"。
快速/完整到达-或清晰链接-至您的显示屏手册/规格-"速度、易用、增强"您(未见、微爱)支持的有效性 crüe。 阿尔利斯!