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.

[参考译文] MSP430F5529:[MSP430F5529 + ili9341屏幕]命令指令只能分步操作

Guru**** 2589265 points
Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/972795/msp430f5529-msp430f5529-ili9341-screen-command-instruction-work-step-by-step-only

器件型号:MSP430F5529

您好!

从几天以来、我正在使用 MSP430F5529和一个 ili9341屏幕处理一个屏幕项目。
我已经带了一名员工(来自 Arduino、在 MSP 上找不到)、并对其进行调整以了解如何使用屏幕。 (不希望任何库用于速度和空间目的)

几次尝试后、我可以用颜色填充屏幕、但无法在特殊位置绘制简单的线条或矩形。
当我逐步运行程序时、所有指令命令都可以工作、并且在屏幕上、我有所有必须执行的程序。

在调试模式和运行模式之间:没有代码更改其它 compil 选项。

我尝试更改所有导线、但没有更改。

非常感谢您的帮助。

//此应用程序不依赖于任何库,它用于 ILI9341

//此程序是清除屏幕显示黑色、白色、红色、绿色、蓝色的演示。

//仅使用分线板并将这些硬件 SPI 线连接到 LCD 时,
// SDA 引脚和 SCK 引脚由系统定义,无法修改。
//如果您不需要控制 LED 引脚,则可以将其设置为3.3V 并将引脚定义设置为-1。
//其他引脚可由您自己定义,例如
//引脚用法如下:
// CS DC/DC RS 复位 SDI/MOSI SCK LED VCC GND
// GND//

请记住设置引脚以适合您的显示模块!

#include 

#define FPROC 25000000

//
P3.0:MOSI
P3.1:MISO
P3.2:CLK
*/

#define RSUP P6OUT|=BIT0 // DC/DC RS
#define RSDOWN P6OUT&&=~BIT0
#define LEDUP P6OUT|=BIT1
#define LEDDOWN P6OUT&=~BIT1
#define CUP P6OUT|=BIT2
#define CSDOWN P6OUT&=~BIT2
#define RESETUP P6OUT|=BIT3
#define RESETDOWN P6OUT&&=~BIT3

unsigned long oldrand = 5468;


void SetVcoreUp (unsigned int level)
{
//打开 PMM 寄存器以写入
PMMCTL0_H = PMMPW_H;
//设置 VMS/SVM 高侧新电平
SVSMHCTL = SVSMSH0 + SVSMHRSHRS0 + SVSHE + SVSM0 *
//将 SVM 低电平设置为新电平
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *电平;
//等待 SVM 稳定
时间((((PMMIFG & SVSMLDLYIFG)=0);
//清除已设置的标志
PMMIFG &=~(SVMLVLRIFG + SVMLMRYIFG)

= 0;//将 PMMCL0设置为新电平
//如果
((PMMIFG & SVMLIFG))、则等待达到新的电平
while (((PMMIFG & SVMLVLRIFG)=0);
//将 SVS/SVM 低电平设置为新的电平
SVSMLCTL = SVSLE + SVSLRVL0 *电平+ SVMLE + SVSMLRRL0 *电平;
//锁定 PMM 寄存器以进行写访问
PMMCTL0_H = 0x00;
}


/
{unsigned int 字体
unsigned long nn = oldrand;
oldran =(unsigned int)((859*nn)%6823);
返回 oldrand % n;
}

void delay (unsigned int i){
while (I-)
__DELAY_CYCLS (FPROC/1000);// 1000 for 1MHz
}

// envoyer sur le SPI la donn é e
void LCD_WLAG_Bus (unsigned char d)
{
while (UCB0STAT 和 BIT0){}// si la communication n'est pas finie on attend
UCB0TXBUF = d;
}

//指令
无效 LCD_Write_COM (无符号字符 VH)
{
RSDOWN;//LCD_RS=0;
LCD_WAVE_Bus (VH);
}

//指令无效 LCD_Write_Data
(无符号字符 VH)
{
RS_1、
unsigned int


Address 1、LCD_1、insigned int (1

LCD_Write_COM (0x2a);
LCD_Write_Data (x1>>8);
LCD_Write_Data (x1);
LCD_Write_Data (x2>>8);
LCD_Write_Data (x2);
LCD_Write_COM (0x2b);
LCD_Write_Data (Y1>>8);
LCD_Write_Data (Y1);
LCD_Write_Data (Y2>>8);
LCD_Write_Data (Y2);
LCD_Write_COM (0x2C);
}

void Draw 像素(unsigned char cr、unsigned char cv、unsigned char cb){
LCD_Write_Data (CR);
LCD_Write_Data (CV);
LCD_Write_Data (CB);
}

void SPI_Init (void)
{
UCB0CTL0 = BIT7 | BIT5 | BIT3;//主设备+ MSbfirst +前单活性剂+ CLK 初始值0
UCB0CTL1 = BIT7 | BIT6;// SMCLK
P3SEL |= 0x07;// ON 利用 LE SPI (CLK、MOSI 等 MISO)
}

void LCD_Init (void)
{
RESETUP;
延迟(5);
RESETDOWN;
延迟(15);
RESETUP;
延迟(15);

CSDOWN;//CS

LCD_Write_COM (0xCB);
LCD_Write_Data (0x39);
LCD_Write_Data (0x2C);
LCD_Write_Data (0x00);
LCD_Write_Data (0x34);
LCD_Write_Data (0x02);

LCD_Write_COM (0xCF);
LCD_Write_Data (0x00);
LCD_Write_Data (0XC1);
LCD_Write_Data (0X30);

LCD_Write_COM (0xE8);
LCD_Write_Data (0x85);
LCD_Write_Data (0x00);
LCD_Write_Data (0x78);

LCD_Write_COM (0xEA);
LCD_Write_Data (0x00);
LCD_Write_Data (0x00);

LCD_Write_COM (0xED);
LCD_Write_Data (0x64);
LCD_Write_Data (0x03);
LCD_Write_Data (0x12);
LCD_Write_Data (0x81);

LCD_Write_COM (0xF7);
LCD_Write_Data (0x20);

LCD_Write_COM (0xC0);//电源控制
LCD_Write_Data (0x23);// 23 VRH[5:0]

LCD_Write_COM (0xC1);//电源控制
LCD_Write_Data (0x10);//SAP[2:0];BT[3:0]

LCD_Write_COM (0xC5);//VCM 控制
LCD_Write_Data (0x3E);//对比度
LCD_Write_Data (0x28);

LCD_Write_COM (0xC7);//VCM control2
LCD_Write_Data (0x86);//-

LCD_Write_COM (0x36);//存储器访问控制
LCD_Write_Data (0x48);// 48 (28 ->模式付款、48 ->模式纵向)

LCD_Write_COM (0x3A);//像素格式设置
LCD_Write_Data (0x66);// 55

LCD_Write_COM (0xB1);
LCD_Write_Data (0x00);
LCD_Write_Data (0x18);// 18

LCD_Write_COM (0xB6);//显示函数控制
LCD_Write_Data (0x08);
LCD_Write_Data (0x82);// 82
LCD_Write_Data (0x27);

LCD_Write_COM (0x11);//退出睡眠
延迟(120);

LCD_Write_COM (0x29);//显示打开
LCD_Write_COM (0x2C);

csup;
}

void H_line (unsigned int x、unsigned int y、unsigned int l、unsigned char cr、unsigned char cv、unsigned char cb)
{
unsigned int i;
CSDOWN;
LCD_Write_COM (0x02c);//write_memory_start
address_set (x、y、l+x、y);
for (i=1;i<=l;i++)
{
Draw 像素(CR、CV、CB);
}
csup;
}

void V_line (unsigned int x、unsigned int y、unsigned int l、unsigned char cr、unsigned char cv、unsigned char cb)
{
unsigned int i;
CSDOWN;
LCD_Write_Com (0x02c);//write_memory_start
Address_set (x、y、x、x、l+y);
for (i = 1;i = 1;i +
i)
Draw _pixel (CR、CV、CB);
}
CSUP;
}

void Rect (unsigned int x、unsigned int y、unsigned int w、unsigned int h、unsigned char cr、unsigned char cv、unsigned char cb)
{
H_line (x、y、w、cr、cv、cv、 CB);
H_line (x、y+h、w、cr、 cv、cb);
V_line (x、y、h、 CR、CV、CB);
V_LINE (x+w、y、 h、cr、cv、cb);
}

void Rectf (unsigned int x、unsigned int y、unsigned int w、unsigned int h、unsigned char cr、unsigned char cv、unsigned char cb)
{
unsigned i;
for (i=0;unsigned <h;i++)   {

H_line (x、y、w、cr、cv、 (b);
H_line (x、y+I、w、cr、cv、 cb);
}


}void LCD_clear (unsigned char cr、unsigned char cv、unsigned char cb)
{
unsigned int ii、mm;
CSDOWN;
Address_set (0、0、240、
i++);for (ii = 0;ii < 240;ii +)
对于(mm=0;mm<320;MM++)
{
Draw 像素(CR、CV、CB);
}
Csup;
}

void LCD_Arc ()
{
无符号 int ii、mm;
unsigned char CB = 0、CV = 0、CR = 0;
CSDOWN;
address_set (0、0、240、320);
对于(ii = 0;ii < 320;ii +){
如果(ii<80) CR=3*(ii%80);
否则,如果(ii<160)CR=3*(80-(ii-80)%80);
否则,如果(ii<240) CB=3*(ii-160)%80);
否则 CB=3*(80-(ii-240)%80);
对于(mm=0;MM<240;MM++)
{
CV = MM%240;
Draw 像素(CR、CV、CB);
}
}
Csup;
}

void LCD_Carre ()
{
unsigned int ii;
CSDOWN;
address_set (10、10、20、20);
对于(ii = 0;ii < 100;ii +){
Draw 像素(0xff、0xff、0xff);
}
Csup;
}

//**
* main.c
*/
void main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

SetVcoreUp(1);
SetVcoreUp(2);
SetVcoreUp(3);

UCSCTL3 |= SELREF_2; //设置 DCO FLL 基准= REFO (32 768)
_bis_SR_register (SCG0); //禁用 FLL 控制环路
UCSCTL0 = 0x0000; //设置可能的最低 DCOx、MODx
UCSCTL1 = DCORSEL_5; //选择 DCO 范围25MHz 操作
UCSCTL2 = FLLD_0 +(FPROC/32768 - 1); //将 DCO 乘法器设置为25MHz (487覆铜16MHz)(761覆铜25MHz)
//(N + 1)* FLLRef = Fdco
//(761 + 1)* 32768 = 25MHz
//设置 FLL Div = fDCOCLK
_BIC_SR_register (SCG0); //启用 FLL 控制环路,然后通过写 SPI 控制寄存器(UCSSELx)选择时钟源

UCSCTL4 |= SE拉美 经济体系3; // P1.0上的 MCLK/1024简要说明
UCSCTL5 |= DIVPA_5 | DIV_5;
P1DIR |= BIT0;
P1SEL |= BIT0;

SPI_Init();
P6DIR |= 0x0F;// bit0 à 3 en sortie

RSUP;
LEDUP;
Csup;
RESETUP;

LCD_Init();

while (1){
LCD_CLEAR (0xff、0xff、0xff);
延迟(1000);
LCD_CLEAR (0xff、0x00、0x00);
延迟(1000);
LCD_CLEAR (0x00、0xff、0x00);
延迟(1000);
LCD_CLEAR (0x00、0x00、0xff);
延迟(1000);
LCD_Arc ();
延迟(3000);
LCD_Carre ();
延迟(5000);
LCD_CLEAR (0x00、0x00、0x00);
rect (10、10、100、50、random (256)、random (256)、random (256));
/*for (i=0;i<100;i++)
{
rect (random (239)、random (319)、random (239)、random (319)、random (256)、random (256)));// x、y、宽度、高亮度、颜色上的矩形
}*/
延迟(5000);
}

_bis_SR_register (LPM4_bits);
}

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

    1) 1)当我阅读 ILI9341数据表(ILI9341_DS_V1.02)第19.3.4节时、最大 SPI 速度为1/TWC = 10MHz。 由于您尚未设置分频值、因此 SPI 以25MHz 运行。 向 SPI_Init()添加类似如下的内容:

    >UCB0BR0 = 5;  // SCK = 25/5=5MHz

    (您可以在以后逐渐加速)

    2) 2)您无需等待 SPI 完成、即可取消对/CS 的置位。 尝试将 CUP 更改为如下所示:

    >#define CUP   DO {while (UCB0STAT&UCBUSY)/*empty*/; P6OUT|=BIT2;}while (0)

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

    您好、感谢您的回复。

    很抱歉、我的回答很晚、我昨天没有检查。

    昨天我也发现了这个问题。 我已经设置 了-opt_level 4关于优化。

    由于我使用2级最大值、因此我没有问题。

    我谨记您的解决方案2。 我忘记了这个问题。

    ILI9341也可以采用30MHz SPI。 (我的 MSP430F5529当前在3.3V 上以30MHz 运行、具有相同的程序)

    感谢大家。