一、接口设计
st7796使用spi接口共需要 接口,分别为
/*
* SCK P0_7
* MOSI P0_5
* CS P0_11
* DC P1_6
* RST P0-19
*/
2、工程创建
1、新建一个基于spi示例创建的工程
2、复制一个在其他工程可以正常驱动的ST7789LCD屏驱动到工程中。
添加st7796文件
3、此次先采用模拟SPI来驱动,验证屏与开发板接口是否正确,屏是否能正常工作。
4、定义IO的宏:
#define CS_PORT MXC_GPIO0
#define CS_PIN MXC_GPIO_PIN_11
#define DC_PORT MXC_GPIO1
#define DC_PIN MXC_GPIO_PIN_6
#define RST_PORT MXC_GPIO0
#define RST_PIN MXC_GPIO_PIN_19
#define SCK_PORT MXC_GPIO0
#define SCK_PIN MXC_GPIO_PIN_7
#define MOSI_PORT MXC_GPIO0
#define MOSI_PIN MXC_GPIO_PIN_5
#define CS_SET MXC_GPIO_OutSet(CS_PORT,CS_PIN)
#define CS_CLR MXC_GPIO_OutClr(CS_PORT,CS_PIN)
#define DC_SET MXC_GPIO_OutSet(DC_PORT,DC_PIN)
#define DC_CLR MXC_GPIO_OutClr(DC_PORT,DC_PIN)
#define RST_SET MXC_GPIO_OutSet(RST_PORT,RST_PIN)
#define RST_CLR MXC_GPIO_OutClr(RST_PORT,RST_PIN)
#define SCK_SET (SCK_PORT->out_set = SCK_PIN)
#define SCK_CLR (SCK_PORT->out_clr = SCK_PIN)
#define MOSI_SET (MOSI_PORT->out_set = MOSI_PIN)
#define MOSI_CLR (MOSI_PORT->out_clr = MOSI_PIN)
5、添加软件spi的初始化
static void tft_spi_init(void)
{
mxc_gpio_cfg_t gpio_out;
gpio_out.port = DC_PORT;
gpio_out.mask = DC_PIN;
gpio_out.pad = MXC_GPIO_PAD_NONE;
gpio_out.func = MXC_GPIO_FUNC_OUT;
gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;
gpio_out.drvstr = MXC_GPIO_DRVSTR_0;
MXC_GPIO_Config(&gpio_out);
gpio_out.port = SCK_PORT;
gpio_out.mask = SCK_PIN;
gpio_out.pad = MXC_GPIO_PAD_NONE;
gpio_out.func = MXC_GPIO_FUNC_OUT;
gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;
gpio_out.drvstr = MXC_GPIO_DRVSTR_0;
MXC_GPIO_Config(&gpio_out);
gpio_out.port = MOSI_PORT;
gpio_out.mask = MOSI_PIN;
gpio_out.pad = MXC_GPIO_PAD_NONE;
gpio_out.func = MXC_GPIO_FUNC_OUT;
gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;
gpio_out.drvstr = MXC_GPIO_DRVSTR_0;
MXC_GPIO_Config(&gpio_out);
gpio_out.port = CS_PORT;
gpio_out.mask = CS_PIN;
gpio_out.pad = MXC_GPIO_PAD_NONE;
gpio_out.func = MXC_GPIO_FUNC_OUT;
gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;
gpio_out.drvstr = MXC_GPIO_DRVSTR_0;
MXC_GPIO_Config(&gpio_out);
gpio_out.port = RST_PORT;
gpio_out.mask = RST_PIN;
gpio_out.pad = MXC_GPIO_PAD_NONE;
gpio_out.func = MXC_GPIO_FUNC_OUT;
gpio_out.vssel = MXC_GPIO_VSSEL_VDDIOH;
gpio_out.drvstr = MXC_GPIO_DRVSTR_0;
MXC_GPIO_Config(&gpio_out);
DC_CLR;
CS_SET;
SCK_CLR;
RST_SET;
}
6、编写发送一个bit的功能函数
static void spi_transmit(void *datain, unsigned int count)
{
uint32_t len = count;
uint8_t *data = (uint8_t *)datain;
uint8_t i;
while (len--)
{
// 发送8位数据,从高位到低位
for(i = 0; i < 8; i++)
{
// 先设置数据
if(*data & 0x80)
{
MXC_GPIO_OutSet(MOSI_PORT, MOSI_PIN);
}
else
{
MXC_GPIO_OutClr(MOSI_PORT, MOSI_PIN);
}
// 时钟脉冲,高电平期间数据有效
MXC_GPIO_OutSet(SCK_PORT, SCK_PIN);
// 短暂延时,确保数据稳定
// for(int j = 0; j < 10; j++);
// 时钟拉低,准备下一位
MXC_GPIO_OutClr(SCK_PORT, SCK_PIN);
// 移位,处理下一位
*data <<= 1;
// 短暂延时
// for(int j = 0; j < 5; j++);
}
data++;
}
}
7、修改st7796命令发送相关指令:
static void st7796_send_command(uint8_t cmd)
{
DC_CLR;
#if SOFT_SPI
CS_CLR;
unsigned char val = cmd;
spi_transmit(&val, 1);
CS_SET;
#else
unsigned char val = cmd;
spi_transmit(&cmd, 1);
#endif
DC_SET;
}
// ��������
static void st7796_send_data(uint8_t *data, uint32_t len)
{
DC_SET; // ����ģʽ
uint16_t val;
#if SOFT_SPI
CS_CLR;
// for(uint32_t i=0;i<len;i++)
// {
// val = data[i];
// spi_transmit(&val, 1);
// }
spi_transmit(data, len);
CS_SET; // ȡ��ѡ��
#else
for(uint32_t i=0;i<len;i++)
{
val = data[i];
spi_transmit(&val, 1);
val++;
MXC_Delay(10);
}
#endif
}
// ����16���
static void st7796_send_data16(uint16_t data)
{
DC_SET;
#if SOFT_SPI
uint8_t buff[2];
buff[0] = data>>8;
buff[1] = data&0xff;
CS_CLR;
spi_transmit(&buff, 2);
CS_SET; // ȡ��ѡ��
#else
spi_transmit(&data, 1);
MXC_Delay(10);
#endif
}
8、修改st7796初始化
void st7796_init(void)
{
tft_spi_init();
// ��ʼ������
//CS_SET;
DC_SET;
RST_SET;
// BL_CLR;
// ��λLCD
RST_CLR;
MXC_Delay(100000);
RST_SET;
MXC_Delay(120000);
// ��ʼ������ - ST7796
st7796_send_command(0x11); // �˳�˯��ģʽ
MXC_Delay(120000);
st7796_send_command(0xf0);
st7796_send_data((uint8_t[]){0xc3}, 1);
st7796_send_command(0x36); // �ڴ����ݷ��ʿ���
st7796_send_data((uint8_t[]){0x48}, 1); // �������������
st7796_send_command(0x3A); // �������ظ�ʽ
st7796_send_data((uint8_t[]){0x05}, 1); // 16���
st7796_send_command(0xB4); // ֡���ʿ��� (����ģʽ)
st7796_send_data((uint8_t[]){0x01}, 1);
st7796_send_command(0xE6);
st7796_send_data((uint8_t[]){0x0f, 0xf2, 0x3f,0x4f,0x4f,0x28,0x0e,0x00}, 8);
st7796_send_command(0xc5);
st7796_send_data((uint8_t[]){0x20}, 1);
st7796_send_command(0xe0);
st7796_send_data((uint8_t[]){0xf0,0x03,0x0a,0x11,0x14,0x1c,0x3b,0x55,0x4a,0x0a,0x13,0x14,0x1c,0x1f},14);
st7796_send_command(0xe1);
st7796_send_data((uint8_t[]){0xf0,0x03,0x0a,0x0c,0x0c,0x09,0x36,0x54,0x49,0x0f,0x1b,0x18,0x1b,0x1f},14);
st7796_send_command(0xf0);
st7796_send_data((uint8_t[]){0x3c}, 1);
st7796_send_command(0xf0);
st7796_send_data((uint8_t[]){0x69}, 1);
// st7796_send_command(0x20); // ���Թر�
MXC_Delay(120000);
st7796_send_command(0x29); // ��ʾ����
// �