新手入门
- 积分
- 13
- 金钱
- 13
- 注册时间
- 2016-8-24
- 在线时间
- 0 小时
|
发表于 2015-1-24 14:34:06
|
显示全部楼层
业余爱好者,硬件IIC终于成功了,之前也是自检不过,可以说明自检不过很有可能是读写时序问题。可能之后也就不做了,但还是分享出来吧,谢谢各位的分享[mw_shl_code=c,true]void Init_I2C1(){
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //配置串口接收端口挂接到9端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //复用功能输出OD
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //配置端口速度为50M
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据参数初始化GPIOB寄存器
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 50000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
u8 MPU_Write_Byte(u8 reg,u8 data){
u16 i;
I2C_GenerateSTART(I2C1,ENABLE);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_Send7bitAddress(I2C1,((MPU_ADDR<<1)|0),I2C_Direction_Transmitter);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_SendData(I2C1,reg);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_SendData(I2C1,data);
I2C_GenerateSTOP(I2C1,ENABLE);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
return 0;
}
u8 MPU_Read_Byte(u8 reg){
u8 reg_data;
u16 i=0;
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_GenerateSTART(I2C1,ENABLE);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_Send7bitAddress(I2C1,((MPU_ADDR<<1)|0),I2C_Direction_Transmitter);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_SendData(I2C1,reg);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_GenerateSTART(I2C1,ENABLE);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_Send7bitAddress(I2C1,((MPU_ADDR<<1)|0),I2C_Direction_Receiver);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_AcknowledgeConfig(I2C1,DISABLE);
I2C_GenerateSTOP(I2C1,ENABLE);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
reg_data = I2C_ReceiveData(I2C1);
return reg_data;
}
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf){
u8 n;
u16 i;
I2C_GenerateSTART(I2C1,ENABLE);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_Send7bitAddress(I2C1,((MPU_ADDR<<1)|0),I2C_Direction_Transmitter);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_SendData(I2C1,reg);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
for(n=0;n<len;n++){
I2C_SendData(I2C1,buf[n]);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
if(n>=(len-1))
I2C_GenerateSTOP(I2C1,ENABLE);
}
}
return 0;
}
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf){
u16 i;
i=0;
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_GenerateSTART(I2C1,ENABLE);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_Send7bitAddress(I2C1,((addr<<1)|0),I2C_Direction_Transmitter);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_SendData(I2C1,reg);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_GenerateSTART(I2C1,ENABLE);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_Send7bitAddress(I2C1,((addr<<1)|0),I2C_Direction_Receiver);
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
I2C_AcknowledgeConfig(I2C1,ENABLE);
while(len){
i=0;
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)&&(i<2100)){
i++;
if(i>2000)
return 1;
}
if(len<=2){
I2C_AcknowledgeConfig(I2C1,DISABLE);
I2C_GenerateSTOP(I2C1,ENABLE);
}
*buf = I2C_ReceiveData(I2C1); //读数据,发送ACK
len--;
buf++;
}
return 0;
}
[/mw_shl_code] |
|