全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 接口/总线/驱动 >

STM32硬件IIC接口的特性及功能解析

时间:2019-07-02 16:00

人气:

作者:admin

标签: 总线 

导读:STM32硬件IIC接口的特性及功能解析-多主机功能:该模块既可做主设备也可做从设备主设备功能C地址检测产生和检测7位/10位地址和广播呼叫支持不同的通讯速度状态标志:发送器/接收器...

STM32具有IIC接口,接口有以下主要特性

多主机功能:该模块既可做主设备也可做从设备

主设备功能

C地址检测

产生和检测7位/10位地址和广播呼叫

支持不同的通讯速度

状态标志:

发送器/接收器模式标志

字节发送结束标志

总线忙标志

错误标志

2个中断向量

可选的拉长时钟功能

具单字节缓冲器的DMA

虽然很多人说STM的硬件IIC不好用,但是对于这么一个设备去探索一下还是很有必要的,指不定哪天就用上了呢,

IIC借口一共有九个寄存器,比较重要的几个寄存器分别如下

1.CR1

STM32硬件IIC接口的特性及功能解析

STM32硬件IIC接口的特性及功能解析

由这几个位我们可以正常产生标准IIC的START条件STOP条件,ACK与NOACK

CR2

控制IIC的通行频率

这两位检测IIC总线是否收到数据

1.对于硬件IIC的初始化流程包括

1.配置IO口,配置为GPIO_Mode_AF_OD模式

2.选择IIC模式

3.选择是否使能自动应答以及设备地址长度

4.设置IIC总线的传输速率

2.硬件IIC的读写操作其实逻辑上和标准总线类似,也是发送地址等待ack发送数据等待ACK,但是因为有硬件的自动参与,所以我们不需要延时了

具体代码如下

voidHmcIICInit(void)

{

/*GPIO初始化*/

GPIO_InitTypeDefGPIO_InitStructure;

/*配置硬件IIC需要的变量*/

I2C_InitTypeDefI2C_InitStructure;

/*使能与I2C1有关的时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);

/*PB6-I2C1_SCL、PB7-I2C1_SDA*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;

GPIO_Init(GPIOB,&GPIO_InitStructure);

/*IIC外设初始化*/

/*I2C配置*/

I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;//配置为普通IIC模式

//I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;

//I2C_InitStructure.I2C_OwnAddress1=SlaveAddress;

I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;//使能自动应答

I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;

I2C_InitStructure.I2C_ClockSpeed=50000;//5K的速度?

/*I2C1初始化*/

I2C_Init(I2C1,&I2C_InitStructure);

/*使能I2C1*/

I2C_Cmd(I2C1,ENABLE);

/*允许应答模式*/

I2C_AcknowledgeConfig(I2C1,ENABLE);

}

voidHmcByteWrite(u8addr,u8dataValue)

{

I2C_GenerateSTART(I2C1,ENABLE);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

I2C_SendData(I2C1,addr);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData(I2C1,dataValue);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTOP(I2C1,ENABLE);

}

u8HmcByteRead(u8addr)

{

u8dataValue;

while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));

I2C_GenerateSTART(I2C1,ENABLE);//起始信号

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);//发送设备地址+写信号

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//

I2C_Cmd(I2C1,ENABLE);

I2C_SendData(I2C1,addr);//发送存储单元地址,从0开始

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTART(I2C1,ENABLE);//起始信号

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Receiver);//发送设备地址+读信号

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

I2C_AcknowledgeConfig(I2C1,DISABLE);

I2C_GenerateSTOP(I2C1,ENABLE);

while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)));

dataValue=I2C_ReceiveData(I2C1);//读出寄存器数据

returndataValue;

}

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信