中级会员
 
- 积分
- 297
- 金钱
- 297
- 注册时间
- 2012-12-22
- 在线时间
- 24 小时
|

楼主 |
发表于 2013-7-23 08:57:50
|
显示全部楼层
昨天晚上回去翻箱倒柜终于找到了代码,贴出部分代码跟大家分享,欢迎指正:
void i2c_init(void)
{
I2C_InitTypeDef I2C_InitStructure;
I2C_DeInit(I2C2);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x0002;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 400000;
I2C_Init(I2C2, &I2C_InitStructure);
//研究库代码发现I2C_Init函数执行后I2C就已经使能了,所以无需I2C_Cmd(I2C2, ENABLE)
I2C_ITConfig(I2C2, I2C_IT_EVT|I2C_IT_ERR, ENABLE);
}
void c02_write_data(u8 address, u8 data0,u8 data1,u8 data2,u8 data3,u8 data4,u8 data5,u8 data6,u8 data7)
{
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
c02_direction = c02_write;
c02_address = address;
c02_data_w[0]=data0; c02_data_w[1]=data1; c02_data_w[2]=data2; c02_data_w[3]=data3;
c02_data_w[4]=data4; c02_data_w[5]=data5; c02_data_w[6]=data6; c02_data_w[7]=data7;
i2c_plan = 0;
I2C_GenerateSTART(I2C2, ENABLE);
while(i2c_plan!=20);
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
delay_ms(5);
}
void c02_read_data(u8 address)
{
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
c02_direction = c02_read;
c02_address = address;
i2c_plan = 0;
I2C_GenerateSTART(I2C2, ENABLE);
}
void I2C2_EV_IRQHandler(void)
{
switch(i2c_plan)
{
case 0:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_SB))//ev5
{
I2C_Send7bitAddress(I2C2, 0xA0, I2C_Direction_Transmitter); i2c_plan=1;//address+w
}
break;
case 1:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_ADDR))//ev6
{
if(I2C_GetFlagStatus(I2C2, I2C_FLAG_TRA)){I2C_SendData(I2C2, c02_address); i2c_plan=2;}
}
break;
case 2:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev8
{
if(c02_direction==c02_write){I2C_SendData(I2C2, c02_data_w[0]); i2c_plan=3;}//write data0
else{I2C_GenerateSTART(I2C2, ENABLE); i2c_plan=11;}
}
break;
/******************************************************************************/
case 3:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev8
{
I2C_SendData(I2C2, c02_data_w[1]); i2c_plan=4;//write data1
}
break;
case 4:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev8
{
I2C_SendData(I2C2, c02_data_w[2]); i2c_plan=5;//write data2
}
break;
case 5:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev8
{
I2C_SendData(I2C2, c02_data_w[3]); i2c_plan=6;//write data3
}
break;
case 6:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev8
{
I2C_SendData(I2C2, c02_data_w[4]); i2c_plan=7;//write data4
}
break;
case 7:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev8
{
I2C_SendData(I2C2, c02_data_w[5]); i2c_plan=8;//write data5
}
break;
case 8:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev8
{
I2C_SendData(I2C2, c02_data_w[6]); i2c_plan=9;//write data6
}
break;
case 9:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev8
{
I2C_SendData(I2C2, c02_data_w[7]); i2c_plan=10;//write data7
}
break;
case 10:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev8_2
{
I2C_GenerateSTOP(I2C2, ENABLE);
i2c_plan=20;
}
break;
/******************************************************************************/
case 11:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_SB))//ev5
{
I2C_Send7bitAddress(I2C2, 0xA0, I2C_Direction_Receiver); i2c_plan=12;//address+r
}
break;
case 12:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_ADDR))//ev6
{
if(!I2C_GetFlagStatus(I2C2, I2C_FLAG_TRA)) i2c_plan=13;
}
break;
case 13:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev7
{
c02_data_r[0] = I2C_ReceiveData(I2C2); i2c_plan=14;//read data0
}
break;
case 14:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev7
{
c02_data_r[1] = I2C_ReceiveData(I2C2); i2c_plan=15;//read data1
}
break;
case 15:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev7
{
c02_data_r[2] = I2C_ReceiveData(I2C2); i2c_plan=16;//read data2
}
break;
case 16:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev7
{
c02_data_r[3] = I2C_ReceiveData(I2C2); i2c_plan=17;//read data3
}
break;
case 17:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev7
{
c02_data_r[4] = I2C_ReceiveData(I2C2); i2c_plan=18;//read data4
}
break;
case 18:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev7
{
I2C_AcknowledgeConfig(I2C2, DISABLE);
c02_data_r[5] = I2C_ReceiveData(I2C2); i2c_plan=19;//read data5
}
break;
case 19:if(I2C_GetFlagStatus(I2C2, I2C_FLAG_BTF))//ev7
{
I2C_AcknowledgeConfig(I2C2, ENABLE);
I2C_GenerateSTOP(I2C2, ENABLE);
c02_data_r[6] = I2C_ReceiveData(I2C2);//read data6
while(!I2C_GetFlagStatus(I2C2, I2C_FLAG_RXNE));
c02_data_r[7] = I2C_ReceiveData(I2C2);//read data7
i2c_plan=21;
}
break;
}
}
当然main函数里面会调用24c02读或写函数去发送start信号 |
|