首页 > 应用 > 单片机应用
[导读]Stm32具有IIC接口,接口有以下主要特性多主机功能:该模块既可做主设备也可做从设备主设备功能C地址检测产生和检测7位/10位地址和广播呼叫支持不同的通讯速度状态标志:发送器/接收器模式标志字节发送结束标志总线忙标

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

本文引用地址: /app/mcu/201901/782894.htm

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

主设备功能

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,但是因为有硬件的自动参与,所以我们不需要延时了

具体代码如下

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;

}



换一批

延伸阅读

[单片机应用] STM32的中断和事件的区别

STM32的中断和事件的区别

这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编......

关键字:STM32 中断 事件

[单片机应用] STM32F103学习笔记 (九) 输入捕获实验

STM32F103学习笔记 (九) 输入捕获实验

这个实验是用 TIM5 的通道 1( PA0) 来做输入捕获, 捕获 PA0 上高电平的脉宽(用 WK_UP 按键输入高电平),通过串口打印高电平脉宽时间。初始化里边先设置上升沿为输入捕捉,进入捕捉中断后,记录TIM5_CNT的值,然......

关键字:STM32F10 输入捕获

[单片机应用] STM32利用DAC+DMA+TIMER 输出正弦波

STM32利用DAC+DMA+TIMER 输出正弦波

使用的是STM32F407的板子,程序参考的是STM32F4xx固件库的DAC_SignalsGeneration文件夹下的程序。官方例程分别使用了DAC的禁止生成波(DAC_WaveGeneration_None)的Escalator W......

关键字:STM32 DAC DMA TIMER 输出正弦波

[单片机应用] 基于stm32f103zet6的定时器的学习3(定时器产生4路PWM)

基于stm32f103zet6的定时器的学习3(定时器产生4路PWM)

定时器TIM3产生四路PWM波输出。首先介绍一下PWM吧,算是给自己充电,脉冲宽度调制(PWM),是英文“Pulse Width Modulation ”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技......

关键字:stm32f103zet6 定时器 PWM

[单片机应用] STM32系列第30篇--DHT11温湿度传感器

STM32系列第30篇--DHT11温湿度传感器

电气特性:工作电压:3.3V-5.5V工作电流 :平均0.5mA输出:单总线数字信号测量范围:湿度20~90%RH,温度0~50℃精度 :湿度±5%,温度±2℃分辨率 :湿度1%,温度1℃其数据包由5Byte(40Bit)组成。数据分小数部......

关键字:STM32系列 DHT11 温湿度传感器

[单片机应用] stm32 在线升级的惨痛经历

stm32 在线升级的惨痛经历

一、问题在成功实现了程序定时在APP和IAP之间来回切换后,以为已经掌握了stm在线升级的秘诀,于是兴冲冲的开始改公司的升级程序。结果,发现程序可以从IAP跳转到APP,但是程序会跑飞。在进入APP模式后,结束调试时,......

关键字:stm32 在线升级

我 要 评 论

网友评论

芯闻号

澳门必赢国际

更多

项目外包

更多

推荐博客