在使用STM32F4单片机的硬件iic时,无法发送数据帧,在调试追踪中发现发送函数一直卡在等待START信号发送的while循环中,是因为我的配置代码有遗漏没写的东西吗?请问有人可以指导一下吗?
void I2C_SendData7(I2C_TypeDef* I2Cx, uint8_t deviceAddress, uint8_t registerAddress, uint8_t* data, uint8_t dataSize) {
u8 i;
// 等待直到I2C空闲
while (I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
// 生成START信号
I2C_GenerateSTART(I2Cx, ENABLE);
// 等待直到START信号被发送
while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
// 发送设备地址和写入位
I2C_Send7bitAddress(I2Cx, deviceAddress, I2C_Direction_Transmitter);
// 等待直到设备地址被发送,并且被ACK
while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
// 发送寄存器地址
I2C_SendData(I2Cx, registerAddress);
// 等待直到寄存器地址被发送,并且被ACK
while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
// 发送数据
for ( i = 0; i < dataSize; i++) {
I2C_SendData(I2Cx, data[i]);
// 等待直到数据被发送,并且被ACK
while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}
// 生成STOP信号
I2C_GenerateSTOP(I2Cx, ENABLE);
}
//初始化IIC
void I2C3_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
I2C_InitTypeDef I2C_InitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
// 使能GPIOA和GPIOC时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC, ENABLE);
// 配置PA8引脚
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
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_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置PC9引脚
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOC, &GPIO_InitStruct);
// 配置PA8引脚的复用功能为I2C功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_I2C3);
// 配置PC9引脚的复用功能为I2C功能
GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_I2C3);
// 使能I2C3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C3, ENABLE);
// 配置I2C外设
I2C_InitStruct.I2C_ClockSpeed = 100000; // 设置通信速率为100kHz
I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; // I2C模式
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; // 50%占空比
I2C_InitStruct.I2C_OwnAddress1 = 0x00; // 主机地址,这里设置为0x00
I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; // 使能应答
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; // 7位地址模式
I2C_Init(I2C3, &I2C_InitStruct);
I2C_ITConfig(I2C3, I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF, ENABLE);
// 使能I2C外设
I2C_Cmd(I2C3, ENABLE);
// Configure the I2C event priority
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = I2C3_EV_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级0 不行换1试试
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}