|
发表于 2020-1-8 10:19:29
|
显示全部楼层
本帖最后由 infozx 于 2020-1-8 10:26 编辑
我搞得那个高频烙铁里用了这个Epson得时钟芯片8025T,折腾了几次,写地址没问题;但发现读取得寄存器地址位跟实际地址漂移了1个,不知道为啥,反正能读,后来就一直那样了懒得深究。
8025能获取得厂家标准资料不多,都是犹抱琵琶半遮面得;上一个跟这种一样蛋疼得芯片是LT8920,datasheet讳莫如深,几十个寄存器配置参数跟神符一样,没有厂家人员得支持只能浑水摸鱼。
- void R8025AC_Read(u8 sadd, u8 *buf, u8 len)
- {
- u8 i;
- i=0;
-
- while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); //等待总线空闲
- I2C_AcknowledgeConfig(I2C_ACK_CURR); //开启发送ACK
-
- I2C_GenerateSTART(ENABLE); //开启I2C起始位
-
- I2C_GenerateSTART(ENABLE); //开启I2C起始位
- while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); /*EV5,主模式*/
- I2C_Send7bitAddress(0x64, I2C_DIRECTION_TX); //发送iic从器件物理地址,最低位0,写操作; 器件地址0x64
- while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
-
- I2C_SendData((sadd<<4)|0x01); //寄存器地址
- while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
-
- //---//
- I2C_GenerateSTART(ENABLE);//开启I2C1起始位
- while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); /*EV5,主模式*/
- I2C_Send7bitAddress(0x65, I2C_DIRECTION_RX); //发送iic从器件物理地址,最低位1,读操作; 器件地址 --
- while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
-
-
- for(i=0;i<len-1;i++)
- {
- while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); //等待数据接收器非空
- buf[i]=I2C_ReceiveData(); //读取一个字节数据
- }
-
- while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED)); //等待数据接收器非空
- buf[i]=I2C_ReceiveData(); //读取最后一个字节数据
-
- I2C_AcknowledgeConfig(I2C_ACK_NONE); //停止发送ACK
- I2C_GenerateSTOP(ENABLE);//发送STOP,关闭I2C1总线
- }
- void R8025AC_Write(u8 sadd,u8 *buf,u8 len)
- {
- u8 i;
- i=0;
-
- while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)); //等待总线空闲
- I2C_AcknowledgeConfig(I2C_ACK_CURR); //开启发送ACK
-
- I2C_GenerateSTART(ENABLE); //开启I2C起始位
-
- I2C_GenerateSTART(ENABLE); //开启I2C起始位
- while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)); /*EV5,主模式*/
- I2C_Send7bitAddress(0x64, I2C_DIRECTION_TX); //发送iic从器件物理地址,最低位0,写操作; 器件地址0x64
- while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
-
- I2C_SendData((sadd<<4)|0x01); //寄存器地址
- while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
-
- for(i=0;i<len;i++)
- {
- while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待数据发送完毕
- I2C_SendData(buf[i]); //发送一个字节数据
- }
-
- I2C_GenerateSTOP(ENABLE);//发送STOP,关闭I2C1总线
- }
复制代码
|
|