uint8_t IIC_Read_Bytes(uint8_t dev, uint8_t reg, uint8_t length, uint8_t *data) { uint8_t count = 0; uint8_t temp; IIC_Start(); IIC_Send_Byte(dev); IIC_Wait_Ack(); IIC_Send_Byte(reg); IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(dev + 1); IIC_Wait_Ack(); for(count = 0; count < length; count++) { if(count != (length - 1) ) temp = IIC_Receive_Byte(1); else temp = IIC_Receive_Byte(0); data[count] = temp; } IIC_Stop(); return count; }
unsigned int ReadADS1110(void) { unsigned int data = 0; unsigned char tmpH = 0; unsigned char tmpL = 0; unsigned char setup = 0; IIC_Start(); IIC_Send_Byte(ADS1110_ADDR | 0x01); IIC_Receive_Byte(&tmpH); IIC_Receive_Byte(&tmpL); IIC_Receive_Byte(&setup); IIC_Stop(); data = (unsigned int)tmpH << 8; data += tmpL; return data; }
/****************************************************************************** 函数(模块)名称:unsigned char IIC_Single_Read(unsigned int R_addr,unsigned char *R_word) 功能: 单次读/随机读 输入参数: 要读的数据地址,输出数据保存的字节指针 输出参数: 1 读成功 0 读失败 其它说明: *******************************************************************************/ unsigned char IIC_Single_Read(unsigned char R_addr,unsigned char *R_word) { unsigned char try_time=define_try_time; //用来定义出现通讯错误时尝试的错误 while(1) { if(!try_time--) //用来防止因硬件错误或其它原因程序进入死循环 { return 0; } IIC_Start(); //步骤1:产生一个启动信号 IIC_Send_Byte(Slave_Addres&(~BIT0)); //步骤2:发送控制命令 if(ReadAck()) continue; //没有应答,忽略下面语句,重新开始 //应答,则开始发送地址 IIC_Send_Byte(R_addr); if(ReadAck()) continue; //没有应答,忽略下面语句,重新开始 //应答,则开始发送启动信号 IIC_Start(); //启动信号 IIC_Send_Byte(Slave_Addres|BIT0); //发送控制命令 if(ReadAck()) continue; //没有应答,忽略下面语句,重新开始 break; //应答,则跳出循环,开始接收数据 } *R_word=IIC_Receive_Byte(); //从总线上接收一个字节数据 WriteAck(1); //发送 非应答信号 IIC_Stop(); //发送停止信号 return 1; }
unsigned int ReadADS1110(void) { unsigned int data = 0; unsigned char tmpH = 0; unsigned char tmpL = 0; unsigned char setup = 0; int i; SetUpADS1110(0x1C | 0x80); for(i = 0;i < 500;i++); do{ i--; IIC_Start(); IIC_Send_Byte(ADS1110_ADDR | 0x01); IIC_Receive_Byte(&tmpH); IIC_Receive_Byte(&tmpL); IIC_Receive_Byte(&setup); IIC_Stop(); }while(((setup | 0x80) == 0x80) && (i > 0)); if(i<0) return 0; data = (unsigned int)tmpH << 8; data += tmpL; return data; }
/****************************************************************************** 函数(模块)名称:unsigned char IIC_Multi_read(unsigned int R_addr,unsigned char *Save_addr, unsigned int R_lent) 功能: 连续读 输入参数: 读起始地址,数据保存指针,读长度 输出参数: 1 读成功 0 读失败 其它说明: *******************************************************************************/ unsigned char IIC_Multi_read(unsigned char R_addr,unsigned char *Save_addr, unsigned int R_lent) { unsigned char try_time=define_try_time; //用来定义出现通讯错误时尝试的错误 while(1) { if(!try_time--) //用来防止因硬件错误或其它原因程序进入死循环 { return 0; } IIC_Start(); //步骤1:产生一个启动信号 IIC_Send_Byte(Slave_Addres&(~BIT0)); //步骤2:发送控制命令 if(ReadAck()) continue; //没有应答,忽略下面语句,重新开始 //应答,则开始发送地址 IIC_Send_Byte(R_addr); if(ReadAck()) continue; //没有应答,忽略下面语句,重新开始 //应答,则开始发送启动信号 IIC_Start(); //启动信号 IIC_Send_Byte(Slave_Addres|BIT0); //发送控制命令 if(ReadAck()) continue; //没有应答,忽略下面语句,重新开始 break; //应答,则跳出循环,开始接收数据 } while(R_lent--) { *Save_addr++=IIC_Receive_Byte(); //从总线上接收一个字节数据 if(R_lent==0) { WriteAck(1); //发送 非应答信号 IIC_Stop(); //发送停止信号 break; } WriteAck(0); //发送应答信号 } return 1; }