新手上路
- 积分
- 33
- 金钱
- 33
- 注册时间
- 2019-6-11
- 在线时间
- 9 小时
|
1金钱
STM32F030R8T6 使用硬件IIC,总是死在while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET),不往下执行,使用的板子没有外挂晶振,使用内部时钟,请大神帮忙赐教
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE );
RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE );
RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
GPIO_Init( GPIOB, &GPIO_InitStructure );
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DigitalFilter=0;
I2C_InitStructure.I2C_OwnAddress1 = 0;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_Timing =0x00901D2B;
I2C_InitStructure.I2C_AnalogFilter=I2C_AnalogFilter_Enable;
I2C_Init( I2C1, &I2C_InitStructure );
I2C_Cmd( I2C1, ENABLE );
}
//*****************************************************
u8 I2C1_ReadByte( u8 id, u8 read_address )
{
u8 data;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);
I2C_TransferHandling(I2C1, id, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
I2C_SendData(I2C1, read_address);
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TC) == RESET);
I2C_TransferHandling(I2C1, id, 1, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET);
data= I2C_ReceiveData(I2C1);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET);
I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
return data;
}
//*****************************************************
void I2C1_WriteByte( u8 id, u8 write_address, u8 data )
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET);
I2C_TransferHandling(I2C1,id, 1, I2C_SoftEnd_Mode,I2C_Generate_Start_Write);
while (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);
I2C_SendData(I2C1, write_address);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TCR) == RESET);
I2C_TransferHandling(I2C1, id, 1, I2C_AutoEnd_Mode, I2C_Generate_Stop);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//if write ok
I2C_SendData(I2C1, data);
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET);
I2C_ClearFlag(I2C1, I2C_ICR_STOPCF);
}
|
|