//I2C初始化
void I2c_Init(void)
{
CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C,ENABLE);
I2C_DeInit();
I2C_Init(100000,0x10, I2C_DUTYCYCLE_2,I2C_ACK_CURR,I2C_ADDMODE_7BIT,16);
I2C_Cmd(ENABLE);
}
//I2C读
void I2c_Read(uint16_t Addr,uint8_t *Data,uint8_t len)
{
char i=0;
while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));
{
delay(50);
i++;
if(i>3)
{
return ;
}
}
/*开始*/
//使能ACK
I2C_AcknowledgeConfig(I2C_ACK_CURR);
I2C_GenerateSTART(ENABLE);
while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
/*设备地址写*/
I2C_Send7bitAddress(SLAVEADDR,I2C_DIRECTION_TX);
while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/*数据地址*/
I2C_SendData((uint8_t)(Addr>>8));
while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData((uint8_t)(Addr&0x00FF));
while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/*重新开始*/
I2C_GenerateSTART(ENABLE);
while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
/*设备地址/读*/
I2C_Send7bitAddress(SLAVEADDR,I2C_DIRECTION_RX);
while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
/*读字节数据*/
for(i=0;i<len;i++)
{
while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
*(Data+i) = I2C_ReceiveData();
}
I2C_AcknowledgeConfig(I2C_ACK_NONE);
/* 停止 */
I2C_GenerateSTOP(ENABLE);
}
时钟频率为16M