TA的每日心情 | 奋斗 2013-1-5 09:15 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
|
大家好,小弟刚接触开发板不久,在学习的过程中遭遇了一些问题,自己尝试着去解决可是没有成功。现在把问题发布在这里,希望各位前辈能给予指点,非常感谢。
我做的实验是想使用stm32f0_DISCOVERY去驱动一个320*240的TFT屏(驱动芯片为ili9320)。通过参考网络上的一些程序,我完成了TFT驱动的修改并做了一个作用是在屏上输出彩带的测试函数。程序完成了,我连接上了硬件进行调试,在调试的结果可谓是“让我欢喜让我忧”。让我“欢喜”的是,某些时候,屏幕可以呈现出我预期的彩带图案,让我“忧”的是输出并不稳定,有些时候输出显示是正常的,有些时候输出显示依然是白茫茫的一片。
对于这个问题,我的解决思路是,从对ili9320的寄存器读写开始排查。于是,我将代码进行修改,将多余的代码全部注释掉,只留下ili9320的寄存器读写函数。代码如下:- /****************************************************/
- /* 函数功能:写命令操作对应寄存器 */
- /* 入口参数;CH:写命令 */
- /* 返回值: 无 */
- /* 说明: 寄存器号是16位数,8位连接方式需要写两次*/
- /****************************************************/
- void Lcd_Write_Com(unsigned int Com)
- {
- // Set_nRd //Rd=1,读失能
- Clr_Cs; //Cs=0,片选使能
- Clr_Rs; //Rs=0,命令
- Clr_nWr; //nWr=0,写入使能
- GPIOB->ODR &= 0xFF00;
- GPIOC->ODR &= 0xFF00;
- GPIOB->ODR |=((Com)&(0x00FF));
- GPIOC->ODR|=(Com>>8);
- Set_nWr; //nWr=1,写入失能
- //Set_Cs; //Cs=1,片选失能
- }
- /***************************************************/
- /* 函数功能;向选定的寄存器写数据 */
- /* 入口参数;DH:16位数据 */
- /* 返回: 无 */
- /* 说明: 写16位数据, */
- /* 使用时需要先使用Lcd_Write_Com(unsigned int CH)选择要把数据写到哪个寄存器里面。*/
- /***************************************************/
- void Lcd_Write_Data(unsigned int Data)
- {
- //Set_nRd //Rd=1,读失能
- Clr_Cs; //Cs=0,片选使能
- Set_Rs; //Rs=1,数据
- Clr_nWr; //nWr=0,写入使能
- GPIOB->ODR &= 0xFF00;
- GPIOC->ODR &= 0xFF00; //把PB,PC数据端口全部置低
- GPIOB->ODR|=((Data)&(0x00FF));//写入低8位
- GPIOC->ODR|=(Data>>8);//写入高八位
- Set_nWr; //nWr=1,写入失能
- Set_Cs; //Cs=1,片选失能
- }
- /******************************************************/
- /* 函数功能向寄存器里写数据 */
- /* 入口参数;com1:寄存器号 dat1:数据值 */
- /* 说明: 该函数是前两个函数的合成,也就是上面两个 */
- /* 函数一般的用法就是这样组合。 */
- /******************************************************/
- void Lcd_Write_Com_Data(unsigned int com1,unsigned int dat1)
- {
- Lcd_Write_Com(com1);
- Lcd_Write_Data(dat1);
- }
- /******************************************************/
- /* 函数功能读寄存器里的数据 */
- /* 入口参数;com2:寄存器号 */
- /******************************************************/
- uint16_t Lcd_Read_Com_Data(uint16_t com2)
- {
- uint16_t val1,val2,val;
- Lcd_Write_Com(com2);
- GPIOB->MODER&=0xFFFF0000; //将PB[7:0]设为 Input mode
- GPIOC->MODER&=0xFFFF0000; //将PC[7:0]设为 Input mode
- Clr_Cs; //Cs=0,片选使能
- Set_Rs; //Rs=1,数据
- Set_nWr;
- Clr_nRd; //nWr=0,读取使能
- val1 = GPIOB->IDR;
- val2 = GPIOC->IDR;
- val=((val1)&(0x00FF))+((val2<<8)&(0xFF00));
- Set_nRd; //nWr=0,读取失能
- Set_Cs;
- GPIOB->MODER|=0x00005555; //输入完了后从新设置为输出
- GPIOC->MODER|=0x00005555;
- return val;
- }
复制代码 然后,在main函数中去读两个寄存器的值,代码如下:- int main(void)
- {
- Device_Init();
- Lcd_Write_Com_Data(0x0000,0x0001);
- delay_ms(50);
- id1=Lcd_Read_Com_Data(0x0000);
- delay_ms(50);
- while (1)
- {
- }
- }
复制代码 我的想法很简单,因为读寄存0x0000,理论上应该返回TFT的驱动ID:9320. 但是,测试结果依然让我失望。同样的代码,读取结果却各不相同:
我将整个工程文件打包在附件中,希望各位前辈指点。非常感谢。
|
|