本帖最后由 trucyw 于 2024-12-19 17:58 编辑
#申请原创#
继RGB组合灯https://bbs.21ic.com/icview-3420686-1-1.html又过去一周了今天无论如何要更新了
刚好手头有一篇两颗IC的7‘’显示屏,那就他了
看了下显示屏的initial code选择了SPI来控制,那就先看下SPI怎么控制先(控制无非就是读&写)
上图的读写可以看到这颗芯片要求为16 clocks一周期,即8bit Address&8bit Data,在Address的MSB为读写标志位(0为写,1为读),bit5和bit6分别控制具体操作那一颗IC。
结合实际IO只需要3个IO即可(SDAI&SDAO共用),其他很多类似的点屏没有看到读的部分,今天在这里把读的部分完善。
分析仪抓取数据与串口打印结果一致(说了这么多还没有上代码不应该)
#ifndef __SPILCD_H
#define __SPILCD_H
#include "at32l021_gpio.h"
//#include "Delay.h"
//////////////////////////////////////////////////////////////////////////////////
//������
//SPILCD��������
//////////////////////////////////////////////////////////////////////////////////
#define GIP_FORWARD
//#define GIP_BACKWARD
#define SPILCD_CS_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_0)
#define SPILCD_CS_Set() gpio_bits_set(GPIOA,GPIO_PINS_0)
#define SPILCD_SCK_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_1)
#define SPILCD_SCK_Set() gpio_bits_set(GPIOA,GPIO_PINS_1)
#define SPILCD_SDA_Clr() gpio_bits_reset(GPIOA,GPIO_PINS_4)
#define SPILCD_SDA_Set() gpio_bits_set(GPIOA,GPIO_PINS_4)
#define SPILCD_SDA_RD gpio_input_data_bit_read(GPIOA,GPIO_PINS_4) //数据端口 PE13
void SPILCD_config(void);
void SPILCD_Writecmd(uint8_t n,uint8_t cmd, uint8_t dat);
uint8_t SPILCD_Readcmd(uint8_t n,uint8_t cmd);
void SPILCD_initial(void);// SPI��ʼ��
#endif
#include "spilcd.h"
#include "Delay.h"
void SPILCD_config(void)
{
gpio_init_type gpio_initstructure;
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
gpio_default_para_init(&gpio_initstructure);
//lcd spi�ܽų�ʼ��
//gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
gpio_initstructure.gpio_pins =GPIO_PINS_0|GPIO_PINS_1|GPIO_PINS_4;
gpio_initstructure.gpio_pull = GPIO_PULL_UP;
gpio_init(GPIOA,&gpio_initstructure);
SPILCD_CS_Set();
SPILCD_SCK_Set();
SPILCD_SDA_Set();
}
// 初始化SPILCD_SDA用到的GPIO口:PA4,输入模式
void SPILCD_SDA_In(void)
{
gpio_init_type gpio_initstructure;
gpio_default_para_init(&gpio_initstructure);
/* DATA引脚:PA4 */
gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure.gpio_mode = GPIO_MODE_INPUT;
gpio_initstructure.gpio_pins = GPIO_PINS_4;
gpio_initstructure.gpio_pull = GPIO_PULL_UP;
gpio_init(GPIOA, &gpio_initstructure);
}
// 初始化SPILCD_SDA用到的GPIO口:PA4,输出模式
void SPILCD_SDA_Out(void)
{
gpio_init_type gpio_initstructure;
gpio_default_para_init(&gpio_initstructure);
/* DATA引脚:PA4 */
gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
gpio_initstructure.gpio_pins = GPIO_PINS_4;
gpio_initstructure.gpio_pull = GPIO_PULL_UP;
gpio_init(GPIOA, &gpio_initstructure);
}
//////////////////////////////////////////////////////////////////////////////////
//����initial����
void SPILCD_Writecmd(uint8_t n,uint8_t cmd, uint8_t dat)
{
uint8_t i;
uint16_t data=((n<<5)|cmd)<<8|dat;
SPILCD_CS_Clr();
for(i=0;i<16;i++)
{
if((data & 0x8000) !=0)
SPILCD_SDA_Set();
else
SPILCD_SDA_Clr();
data<<=1;
SPILCD_SCK_Clr();
SPILCD_SCK_Set();
}
SPILCD_CS_Set();
}
uint8_t SPILCD_Readcmd(uint8_t n,uint8_t cmd)
{
uint8_t i,recive=0;
uint8_t data=0x80|(n<<5)|cmd;
SPILCD_CS_Clr();
for(i=0;i<8;i++)
{
if((data & 0x80) !=0)
SPILCD_SDA_Set();
else
SPILCD_SDA_Clr();
data<<=1;
SPILCD_SCK_Clr();
SPILCD_SCK_Set();
}
SPILCD_SDA_In();
for(i=0;i<8;i++)
{
SPILCD_SCK_Clr();
SPILCD_SCK_Set();
recive<<=1;
if(SPILCD_SDA_RD)recive++;
}
SPILCD_SCK_Clr();
SPILCD_SDA_Out();
SPILCD_CS_Set();
printf("SPILCD_Readcmd: %d 0x%02x 0x%02x\r\n",n,cmd,recive);
return recive;
}
//SPILCD_initial��ʼ��
void SPILCD_initial(void)
{
uint8_t i;
for(i=0;i<2;i++)
{
SPILCD_Writecmd(i,0x00,0x00);
SPILCD_Readcmd(i,0x05);
SPILCD_Readcmd(i,0x1E);
SPILCD_Writecmd(i,0x00,0x00);
SPILCD_Writecmd(i,0x02,0xB1);
SPILCD_Writecmd(i,0x03,0x03);
SPILCD_Writecmd(i,0x04,0x40);
#ifdef GIP_BACKWARD
SPILCD_Writecmd(i,0x00,0x10);
SPILCD_Writecmd(i,0x01,0x01);
SPILCD_Writecmd(i,0x02,0x19);
SPILCD_Writecmd(i,0x03,0x09);
SPILCD_Writecmd(i,0x04,0x0A);
SPILCD_Writecmd(i,0x05,0x0B);
SPILCD_Writecmd(i,0x06,0x0C);
SPILCD_Writecmd(i,0x07,0x21);
SPILCD_Writecmd(i,0x08,0x22);
SPILCD_Writecmd(i,0x09,0x2B);
SPILCD_Writecmd(i,0x0A,0x00);
#endif
#ifdef GIP_FORWARD
SPILCD_Writecmd(i,0x00,0x10);
SPILCD_Writecmd(i,0x01,0x19);
SPILCD_Writecmd(i,0x02,0x01);
SPILCD_Writecmd(i,0x03,0x0C);
SPILCD_Writecmd(i,0x04,0x0B);
SPILCD_Writecmd(i,0x05,0x0A);
SPILCD_Writecmd(i,0x06,0x09);
SPILCD_Writecmd(i,0x07,0x21);
SPILCD_Writecmd(i,0x08,0x22);
SPILCD_Writecmd(i,0x09,0x28);
SPILCD_Writecmd(i,0x0A,0x2A);
#endif
}
}
解释下SPILCD_initial中定义 i 的作用是因为本产品有两颗芯片,每颗芯片都需要更新初始化代码
代码完成,看下效果先(使用的是显示IC自动送图功能,目前选择的是绿色)
|
|