初始化为主机
void I2C_GPIO_Init(void)
{
GPIO_PortBModeSet(GPIOB4, 0);
GPIO_RegOneBitSet(GPIO_B_OE, GPIOB4);
GPIO_RegOneBitClear(GPIO_B_IE, GPIOB4);
GPIO_PortBModeSet(GPIOB5, 0);
GPIO_RegOneBitSet(GPIO_B_OE, GPIOB5);
GPIO_RegOneBitClear(GPIO_B_IE, GPIOB5);
GPIO_RegOneBitSet(GPIO_B_PU, GPIOB4);
GPIO_RegOneBitClear(GPIO_B_PD, GPIOB4);
GPIO_RegOneBitSet(GPIO_B_PU, GPIOB5);
GPIO_RegOneBitClear(GPIO_B_PD, GPIOB5);
I2C_Init(0x28, I2C_PORT_B4_B5, B1X_ADDR);
DelayMs(1000);
}
发送数据接口
unsigned char I2C_WriteByte(int DeviceAddress, int WriteAddress, uint8_t SendByte)
{
return I2C_MasterSendData(DeviceAddress, WriteAddress, &SendByte, 1, 100);
}
/**
* @brief I2C主模式下发送数据
*
* @param[in] SlaveAddr 从设备地址
* @param[in] RegAddr 从设备寄存器地址
* @param[in] SendBuf 发送数据缓存
* @param[in] BufLen 数据长度
* @param[in] timeout 超时时间设置
*
* @return i2c state 详见 I2C_ErrorState
*/
I2C_ErrorState I2C_MasterSendData(uint8_t SlaveAddr, uint8_t RegAddr, void* SendBuf, uint32_t BufLen, uint32_t timeout)
{
TIMER I2CTimer;
uint32_t i;
TimeOutSet(&I2CTimer, timeout);
while(I2C_IsBusy())
{
if(IsTimeOut(&I2CTimer))
{
return ERROR_BUSY;
}
}
I2C_MasterConfig();
//send slave address
I2C_SendByte(SlaveAddr);
while(!I2C_GetIntFlag());
I2C_IntClr();
if(I2C_ReceiveAcknowledge())
{
I2C_SendStop();
return ERROR_NOACK;
}
//send register address
I2C_SendByte(RegAddr);
while(!I2C_GetIntFlag());
I2C_IntClr();
if(I2C_ReceiveAcknowledge())
{
I2C_SendStop();
return ERROR_NOACK;
}
//send data
for(i=0; i<BufLen; i++)
{
I2C_SendByte(((uint8_t *)SendBuf)[i]);
while(!I2C_GetIntFlag());
I2C_IntClr();
if(I2C_ReceiveAcknowledge())
{
I2C_SendStop();
return ERROR_NOACK;
}
}
I2C_SendStop();
return ERROR_OK;
}