IO模拟SPI时序问题
最近用IO口模拟SPI来初始化一液晶屏,但是一直没有初始化成功(成功的标志是液晶屏出现花屏),自己已经检查过了所写的spi函数,没有发现问题,下面是我程序和液晶屏spi时序图,希望大家来共同讨论一下,谢谢!
程序如下:
#define SCLK(a) rGPDDAT = (rGPDDAT & ~(1 << 9)) | (a << 9) /*BUF_VD17 GPD9*/
#define SDI(a) rGPDDAT = (rGPDDAT & ~(1 << 10)) | (a << 10) /*BUF_VD18 GPD10*/ #define CS(a) rGPDDAT = (rGPDDAT & ~(1 <<8 )) | (a << 8) /*BUF_VD16 GPD8 */
#define CS(a) rGPDDAT = (rGPDDAT & ~(1 <<8 )) | (a << 8) /*GPD8 */
#define LCD_Command 1 /*Write Register*/
#define LCD_Data 0 /*Write Data */
void Lcd_Port_Init(void) //lcd所有信号线配置
{
/*
Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
VD0,1,2 output
bit31 ***************************************** 0
10 10 10 10 10 01 01 01 01 00 00 10 10 10 10 00
a a 9 5 5 6 a 9
*/
rGPCCON=0xaa9542a8;
rGPCUP=0xffffffff; /* Disable Pull-up register */
/*
Initialize VD[15:8],VD8,9,16,17,18 OUTPUT
bit31 ***************************************** 0
10 10 10 10 10 01 01 01 10 10 10 10 10 10 01 01
a a 9 5 a a a 5
*/
rGPDCON=0xaa95aaa5;
rGPDUP=0xffffffff; /* Disable Pull-up register */
}
void Lcd_SPI_Process(U8 type, U16 datas)
{
unsigned char i;
unsigned char orders;
CS(0);
DelayNo(1000);
if(type == 1)
{
orders = 0x74; //写命令
}
else
{
orders = 0x76; //写数据
}
for(i = 0; i < 8; i++) //写8为命令
{
SCLK(0);
DelayNo(1000); //延时这么长时间是为了能在示波器上看见,示波器是模拟20mhz的
if(orders & 0x80)
{
SDI(1);
}
else
{
SDI(0);
}
DelayNo(1000);
SCLK(1);
DelayNo(1000);
orders = orders << 1;
}
for(i = 0; i <16; i++) //写对应数据
{
SCLK(0);
DelayNo(1000);
if(datas & 0x8000)
{
SDI(1);
}
else
{
SDI(0);
}
DelayNo(1000);
SCLK(1);
DelayNo(1000);
datas = datas << 1;
}
CS(1);
}
void DelayNo(U32 i)
{
for(;i>0;i--);
}
void LCD_CtrlWrite_ILI9320(unsigned char reg, U16 datas)
{
Lcd_SPI_Process(LCD_Command,reg);
Lcd_SPI_Process(LCD_Data,datas);
}