博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32硬件IIC操作
阅读量:5151 次
发布时间:2019-06-13

本文共 2927 字,大约阅读时间需要 9 分钟。

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

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

主设备功能

C地址检测

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

支持不同的通讯速度

状态标志:

发送器/接收器模式标志

字节发送结束标志

总线忙标志

错误标志

2个中断向量

可选的拉长时钟功能

具单字节缓冲器的DMA

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

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

1.       CR1

由这几个位我们可以正常产生标准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,但是因为有硬件的自动参与,所以我们不需要延时了

 

具体代码如下

 

void HmcIICInit(void){	/*GPIO初始化*/	GPIO_InitTypeDef GPIO_InitStructure;	/* 配置硬件IIC需要的变量 */ 	I2C_InitTypeDef I2C_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);   }void HmcByteWrite(u8 addr,u8 dataValue){	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);}u8 HmcByteRead(u8 addr){	u8 dataValue;	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);//读出寄存器数据	return dataValue;}

转载于:https://www.cnblogs.com/dengxiaojun/p/4279440.html

你可能感兴趣的文章
[毕业生的商业软件开发之路]C#异常处理
查看>>
一些php文件函数
查看>>
有关快速幂取模
查看>>
Linux运维必备工具
查看>>
字符串的查找删除
查看>>
NOI2018垫底记
查看>>
快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
查看>>
Codeforces Round #277 (Div. 2)
查看>>
【更新】智能手机批量添加联系人
查看>>
NYOJ-128前缀式计算
查看>>
淡定,啊。数据唯一性
查看>>
深入理解 JavaScript 事件循环(一)— event loop
查看>>
Hive(7)-基本查询语句
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
NSPredicate的使用,超级强大
查看>>
自动分割mp3等音频视频文件的脚本
查看>>
判断字符串是否为空的注意事项
查看>>
布兰诗歌
查看>>
js编码
查看>>