初级会员

- 积分
- 180
- 金钱
- 180
- 注册时间
- 2015-3-2
- 在线时间
- 36 小时
|

楼主 |
发表于 2017-8-30 16:21:12
|
显示全部楼层
谢谢!STM32F407ZGT6, 就是在原子 探索者板子玩,我也可以把我的代码发出来给你看一下
void ODM_I2C_Init(I2C_TypeDef *I2Cx,u16 speed)
{
GPIO_InitTypeDef GPIO_InitStruct;
//NVIC_InitTypeDef NVIC_InitStruct;
I2C_InitTypeDef I2C_InitStruct;
//RCC_ClocksTypeDef RCC_Clock;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_25MHz;
I2C_InitStruct.I2C_Ack=I2C_Ack_Enable;
I2C_InitStruct.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
I2C_InitStruct.I2C_ClockSpeed=speed*1000;
I2C_InitStruct.I2C_DutyCycle=I2C_DutyCycle_2;
I2C_InitStruct.I2C_Mode=I2C_Mode_I2C;
// NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=4;
// NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
// NVIC_InitStruct.NVIC_IRQChannelCmd=DISABLE;
// RCC_GetClocksFreq(&RCC_Clock);
//ulTimeOut_Time=(RCC_Clock.SYSCLK_Frequency/10000);
if(I2Cx==I2C1) //I2C1
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_I2C1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_I2C1);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
GPIO_Init(GPIOB,&GPIO_InitStruct);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1,DISABLE);
I2C_DeInit(I2C1);
I2C_InitStruct.I2C_OwnAddress1=0xAA;
I2C_Cmd(I2C1,ENABLE);
I2C_Init(I2C1,&I2C_InitStruct);
I2C_AcknowledgeConfig(I2C1, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel=I2C1_EV_IRQn;
NVIC_Init(&NVIC_InitStruct);
}
else if(I2Cx==I2C2) //I2C2
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_I2C2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_I2C2);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
GPIO_Init(GPIOB,&GPIO_InitStruct);
I2C_DeInit(I2C2);
I2C_InitStruct.I2C_OwnAddress1=0x99;
I2C_Init(I2C2,&I2C_InitStruct);
I2C_Cmd(I2C2,ENABLE);
NVIC_InitStruct.NVIC_IRQChannel=I2C2_EV_IRQn;
NVIC_Init(&NVIC_InitStruct);
}
}
void I2C_Read_nByte(I2C_TypeDef *I2Cx,u8 DeviceAddr,u8 RegAddr,u8 *RData,u8 len)
{
u32 TimeOut=10000;
I2C_AcknowledgeConfig(I2Cx,ENABLE);
while((TimeOut--)&&I2C_GetFlagStatus(I2Cx,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2Cx,ENABLE);
TimeOut=10000;
while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)));
if(TimeOut==0) printf("2");
I2C_Send7bitAddress(I2Cx,DeviceAddr,I2C_Direction_Transmitter);
TimeOut=10000;
while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)));
if(TimeOut==0) printf("3");
I2C_SendData(I2Cx,RegAddr);
TimeOut=10000;
while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED)));
if(TimeOut==0) printf("4");
I2C_GenerateSTART(I2Cx,ENABLE);
TimeOut=10000;
while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)));
if(TimeOut==0) printf("5");
I2C_Send7bitAddress(I2Cx,DeviceAddr,I2C_Direction_Receiver);
TimeOut=10000;
while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)));
if(TimeOut==0) printf("6");
//I2C_AcknowledgeConfig(I2Cx,DISABLE);
I2C_AcknowledgeConfig(I2Cx,ENABLE);
//I2C_GenerateSTOP(I2Cx,ENABLE);
while(len--)
{
*(RData++)=I2C_ReceiveData(I2Cx);
TimeOut=10000;
while((TimeOut--)&&(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_RECEIVED)));
if(TimeOut==0) printf("7");
}
I2C_GenerateSTOP(I2Cx,ENABLE);
}
|
|