一、iML7991
7991是应用在TFT-LCD领域的P-GAMMA芯片,利用IIC对其内部的GAMMA值(共14个)进行设定。7991地址表参考图1.1。
![图1.1 部分GMAMA值](https://img-blog.csdnimg.cn/0c4d5a03668c406ea466cbb28a485736.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hHRVZSRkJJRVJCVg==,size_16,color_FFFFFF,t_70#pic_center)
可以看到两个GAMMA值共用3个地址,补充一点,gamma值是画面显示的参考绑点值,相关LCD等方面的知识不做介绍。7991写操作示意图,iic规则与通用的iic并无区别。
![7991写操作示意图,iic规则与通用的iic并无区别](https://img-blog.csdnimg.cn/335843fced5948a09578f9e503870694.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hHRVZSRkJJRVJCVg==,size_16,color_FFFFFF,t_70#pic_center)
7991的读操作稍微有点差异,但是问题不大,需要重新产生start条件。
![](https://img-blog.csdnimg.cn/efc0b789aa734d10bfa3cde3e23cdf5b.png#pic_center)
二、stm32f10x端的iic配置
将stm32作为主机,选取GPIOB6(SCL)与 GPIOB7(SDA)作为iic传输线,采用stm32f10x函数库里的函数编写代码。
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle =I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 400000;
stm32f10x的函数库非常丰富,可以直接利用库函数进行编写。事件的判断是主要的难点。
![](https://img-blog.csdnimg.cn/f956972d3c6a4386a209e4b9193f90b9.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hHRVZSRkJJRVJCVg==,size_16,color_FFFFFF,t_70#pic_center)
void WriteByte(u8 addr,u8 data)
{
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,Slave_address,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, addr);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, data);
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1, ENABLE);
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/2907b8cf07d9400683c6ee46478e0817.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hHRVZSRkJJRVJCVg==,size_16,color_FFFFFF,t_70#pic_center)
主机变为接收模式的时候,读取数据前要先将DR寄存器清楚(我在重新产生start条件后选择了事件6,结果不对,于是发现了在读数据之前要先清)
u8 I2C_ReadByte(uint8_t addr)
{
u8 ReadData;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, Slave_address, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, addr);
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, Slave_address, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED ));
ReadData=I2C_ReceiveData(I2C1);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
I2C_GenerateSTOP(I2C1, ENABLE);
return ReadData;
}
三、验证
我在验证的时候加了个OLED的显示屏来显示读到的字。
先向7991中某个地址发送一个值,然后再将其读出来,最后用OLED显示出来。
![在这里插入图片描述](https://img-blog.csdnimg.cn/332d2d8abca64a2ba64a2a54dbcb7e99.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hHRVZSRkJJRVJCVg==,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/f8029d57e6414e24b80063169ff00382.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0hHRVZSRkJJRVJCVg==,size_16,color_FFFFFF,t_70#pic_center)
将7991中的GAMMA值全部设定后放到tcon板上,显示画面正常。
四、总结
老拿公司的芯片玩确实不太好,还是买块FPGA方便点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)