标题:
请教一下stm32f4硬件I2C速度异常的问题
[打印本页]
作者:
OHHO
时间:
2021-3-18 23:36
标题:
请教一下stm32f4硬件I2C速度异常的问题
最近用HK的32画了一块板子想测试一下芯片功能,用到了硬件IIC,因为我之前一直都是用的模拟IIC,没接触过硬件IIC,就花了点时间研究了一下网上的案例。测试的时候用的是正点的stm32f407探索者板子,依手册PB6,7 或者PB8,9都可复用为I2C1,我就随便挑了一组。写完IIC几个关键函数以后试着跑了一下中景园那个OLED的例程,屏的代码是绝对没问题的,大家用过都知道。硬件IIC运行成功,然后代码里有一步是scroll刷屏显示汉字,速度奇慢无比,与软件IIC比起来差了三四倍,但是我的硬件IIC已经都配置成400KHZ了,照样没用。现在有两个疑惑:
1.依原子的原理图该I2C1 4.7K上拉,除了我自己挂载的OLED外,连接了器件24C02,MPU6050,WM8978,只启动了I2C1总线,在没有对这些器件使能编写驱动的时候,他们是否也属于挂在I2C1总线上,这样的话,会不会是驱动能力不足的问题?(没接触过多个从机不太了解忘指教)
2.怀疑是IIC实现代码出了问题,检查ev5,ev6,ev8-2等事件时,需要重复进行检测读取,造成了巨大的卡顿。问一下各位大佬是因为这部分函数的问题吗,如果是的话,我该怎么优化呢。
下附我参考别人修改的I2C程序。
//PB6 PB7复用为SCL和SDA
void I2C1_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏,实现IIC线与
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_I2C1);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_I2C1);
}
//I2C配置
void I2C1_Configuration(void)
{
I2C_InitTypeDef I2C_InitStructure;
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//I2C模式
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//SCL占空比
I2C_InitStructure.I2C_OwnAddress1 = 0XA0;//主机地址
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress= I2C_AcknowledgedAddress_7bit;//七位地址
I2C_InitStructure.I2C_ClockSpeed = 400000;//400KHZ
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
//I2C初始化
void I2C1_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);//I2C时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//GPIO时钟使能
I2C1_GPIO_Configuration();
I2C1_Configuration();
}
//起始信号 0成功 1失败
u8 I2C_Start(void)
{
u16 time=0;
I2C_GenerateSTART(I2C1,ENABLE);
//检查ev5事件
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS)
{
time++;
if(time>1000)
{
return 1;
}
}
return 0;
}
//结束信号
void I2C_Stop(void)
{
I2C_GenerateSTOP(I2C1,ENABLE);
}
//发送从设备地址
u8 I2C_SendAddr(u8 addr)
{
u32 event=I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED;//发送模式
u16 time=0;
I2C_Send7bitAddress(I2C1,addr,addr&0x01);
if(addr&0x01)//判断末位
event=I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED;//接收模式
//检查ev6事件
while(I2C_CheckEvent(I2C1,event)!=SUCCESS)
{
time++;
if(time>1000)
{
return 1;
}
}
return 0;
}
//发送数据
void I2C_SendDat(u8 data)
{
I2C_SendData(I2C1,data);
}
//获取应答信号
u8 I2C_get_Ack(void)
{
u16 time=0;
//检查ev8-2
while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS)
{
time++;
if(time>1000)
{
return 1;
}
}
return 0;
}
复制代码
作者:
OHHO
时间:
2021-3-21 15:46
有没有大佬能帮忙回复一下,麻烦了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1