一、IIC使用进阶过程
1.1调用高度封装的IIC读写函数
void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
只需要看芯片手册,知道器件地址,命令或寄存器地址,调用IIC写或写函数,便可完成一次写或写操作。
1.2调用封装好的IIC操作函数,对着时序自己封装对IIC器件的操作函数
//IIC所有操作函数
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); //发送IIC开始信号
void IIC_Stop(void); //发送IIC停止信号
void IIC_Send_Byte(u8 txd); //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); //IIC等待ACK信号
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号
例如:pcf8591(详见后文)
使用PCF8591 DAC功能
int Pcf8591ReadByte(unsigned char addr)
{
int num;
IIC_Start();
IIC_Send_Byte(ADDR_PCF8591);
if(IIC_Wait_Ack() != 0){
//printf("wait ack error\r\n");
return -1;
}
IIC_Send_Byte(addr);//0x01
if(IIC_Wait_Ack() != 0){
//printf("wait ack error\r\n");
return -1;
}
IIC_Stop();
IIC_Start();
IIC_Send_Byte(0x91);
if(IIC_Wait_Ack() != 0){
//printf("wait ack error\r\n");
return -1;
}
num = IIC_Read_Byte(1); //上次测量的结果
num = IIC_Read_Byte(0);
IIC_Stop();
return num;
}
使用PCF8591 DAC功能
int Pcf8591SendByte(unsigned char num)
{
IIC_Start();
IIC_Send_Byte(WRITEADDR);
if(IIC_Wait_Ack() != 0){
//printf("wait ack error\r\n");
return -1;
}
IIC_Send_Byte(0x40);
if(IIC_Wait_Ack() != 0){
//printf("wait ack error\r\n");
return -1;
}
IIC_Send_Byte(num);
if(IIC_Wait_Ack() != 0){
//printf("wait ack error\r\n");
return -1;
}
IIC_Stop();
return 1;
}