/****** busrt one byte via I2C *****/ void I2C_WriteByte(uint8_t SlaveAddress,uint8_t REG_Address,uint8_t REG_data) { IIC_Start(); //起始信号 IIC_SendByte(SlaveAddress); //发送设备地址+写信号 IIC_SendByte(REG_Address); //内部寄存器地址, //请参考中文pdf22页 IIC_SendByte(REG_data); //内部寄存器数据, //请参考中文pdf22页 IIC_Stop(); //发送停止信号 }
void Single_Write_IIC(u8 SlaveAddress,u8 REG_Address,u8 REG_data) { IIC_Start(); IIC_SendByte(SlaveAddress); IIC_SendByte(REG_Address); IIC_SendByte(REG_data); IIC_Stop(); }
void SetPWM(uint8_t num, uint16_t on, uint16_t off) { IIC_Start(); IIC_SendByte(LED0_ON_L+num*4); IIC_SendByte(on); IIC_SendByte(on>>8); IIC_SendByte(off); IIC_SendByte(off>>8); IIC_Stop(); }
/******************************************************************************* **函 数: IIC_WriteByte **功 能: IIC往指定地址写一字节数据 **参 数: Addr --地址 ** data --发送的数据 **返 回: void *******************************************************************************/ void IIC_WriteByte(u8 Addr,u8 data) { IIC_Start(); IIC_SendByte(DEVICE_ADDR); //WriteDeviceAddr IIC_WaitAck(); IIC_SendByte(Addr); IIC_WaitAck(); IIC_SendByte(data); IIC_WaitAck(); IIC_Stop(); }
/****** busrt write bytes via I2C *****/ void I2C_WriteBytes(uint8_t SlaveAddress,uint8_t REG_Address,uint8_t *REG_data, uint8_t num) { int i; IIC_Start(); //起始信号 IIC_SendByte(SlaveAddress); //发送设备地址+写信号 IIC_SendByte(REG_Address); //内部寄存器地址, //请参考中文pdf22页 for(i = 0; i < num; i++) { IIC_SendByte(REG_data[i]); //内部寄存器数据, //请参考中文pdf22页 } IIC_Stop(); //发送停止信号 }
/********单字节读取*****************************************/ uint8_t I2C_ReadByte(uint8_t SlaveAddress, uint8_t REG_Address) { char REG_data; IIC_Start(); //起始信号 IIC_SendByte(SlaveAddress); //发送设备地址+写信号 IIC_SendByte(REG_Address); //发送存储单元地址,//从0开始 IIC_Start(); //起始信号 IIC_SendByte(SlaveAddress+1); //发送设备地址+读信号 REG_data = IIC_RecvByte(); //读出寄存器数据 IIC_SendNACK(); IIC_Stop(); //停止信号 return REG_data; }
u8 Single_Read_IIC(u8 SlaveAddress, u8 REG_Address) { u8 REG_data; IIC_Start(); IIC_SendByte(SlaveAddress); IIC_SendByte(REG_Address); IIC_Start(); IIC_SendByte(SlaveAddress+1); REG_data = IIC_RecvByte(); IIC_SendACK(); IIC_Stop(); return REG_data; }
/******************************************************************************* **函 数: IIC_WriteDataN **功 能: IIC往指定地址连续写N个数据 **参 数: Addr --地址 ** pData --发送数据指针 ** len --发送数据长度 **返 回: void *******************************************************************************/ void IIC_WriteDataN(u8 Addr , u8 *pData , u8 len) { u8 i,*pTemp= pData; IIC_Start(); IIC_SendByte(DEVICE_ADDR); IIC_WaitAck(); IIC_SendByte(Addr); IIC_WaitAck(); for(i=0;i<len;i++) { IIC_SendByte(*pTemp); IIC_WaitAck(); pTemp++ ; } IIC_Stop(); }
/******************************************************************************* **函 数: IIC_ReadByte **功 能: IIC读指定地址字节数据 **参 数: Addr --地址 **返 回: 接收的数据 *******************************************************************************/ u8 IIC_ReadByte(u8 Addr) { u8 data; IIC_Start(); IIC_SendByte(DEVICE_ADDR); IIC_WaitAck(); IIC_SendByte(Addr); IIC_WaitAck(); IIC_Start(); IIC_SendByte(DEVICE_ADDR+1); //ReadDeviceAddr IIC_WaitAck(); data=IIC_GetByte(); IIC_NACK(); IIC_Stop(); return data; }
/******************************************************************************* **函 数: IIC_ReadDataN **功 能: IIC在指定地址连续读N个数据 **参 数: Addr --地址 ** pData --接收数据指针 ** len --接收数据长度 **返 回: void *******************************************************************************/ void IIC_ReadDataN(u8 Addr,u8 *pData,u8 len) { u8 i,*pTemp= pData; IIC_Start(); IIC_SendByte(DEVICE_ADDR); IIC_WaitAck(); IIC_SendByte(Addr); IIC_WaitAck(); IIC_Start(); IIC_SendByte(DEVICE_ADDR+1); IIC_WaitAck(); for(i=0;i<len-1;i++) { *(pTemp++) = IIC_GetByte(); IIC_ACK(); } *(pTemp++) = IIC_GetByte(); IIC_NACK(); IIC_Stop(); }
/* * Function: burst read bytes */ void I2C_ReadBytes(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint8_t num) { int i = num; IIC_Start(); //起始信号 IIC_SendByte(SlaveAddress); //发送设备地址+写信号 IIC_SendByte(REG_Address); //发送存储单元地址,//从0开始 IIC_Start(); //起始信号 IIC_SendByte(SlaveAddress+1); //发送设备地址+读信号 for(i = 0; i < num; i++) { buf[i] = IIC_RecvByte(); // if it is the last byte to be read, then it should end up with an IIC_SendNACK() if (i == num - 1) { IIC_SendNACK(); break; // else it needs an acknowledgement } else IIC_SendACK(); } IIC_Stop(); return; }