STM32自带的IIC配置
以下是main.c中的内容:
//**********************************************************
// 使用STM32F103自带的IIC,利用IIC2实现STM32与EEPROM芯片
// AT24C02间的数据传输。传输成功在LCD上显示。
// 试验平台为正点原子的ALIENTEK战舰开发板
//**********************************************************
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
#include "iic.h"int main(void)
{u8 data = 0; //测试的数据变量delay_init(); //延时函数初始化uart_init(9600); //通用异步首发传输器初始化LCD_Init(); //TFTLCD液晶初始化I2C2_Init(); //STM32硬件自带IIC2初始化NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级I2C2_WriteByte( AT24C02_ADDRESS, 1, 0x89 ); //往EEPROM的第1个地址里写入0X89data = I2C2_ReadByte( AT24C02_ADDRESS, 1 ); //读取EEPROM第1个地址里的数据,赋给data if (data==0x89) //如果data = 0X89,证明EEPROM写、读成功,STM32的IIC2写、读成功{POINT_COLOR = RED; //设置字体为红色 LCD_ShowString(35,50,200,16,16,"STM32 IIC2 READ/WRITE");LCD_ShowString(70,70,200,16,16,"SUCCESSFULLY");} while (1);
}
以下是iic.c中的内容:
#include "iic.h"//*****************************************************
// IIC2初始化函数:初始化STM32硬件自带的IIC2
// IIC2_SCL对应GPIO.B10
// IIC2_SDA对应GPIO.B11
//*****************************************************
void I2C2_Init(void)
{/*GPIO与IIC初始化结构体*/GPIO_InitTypeDef GPIO_InitStructure;I2C_InitTypeDef I2C_InitStructure;/*GPIO与IIC时钟使能*/RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //GPIOB时钟使能RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C2, ENABLE ); //IIC2时钟使能/*初始化GPIO*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //初始化GPIO.B10(IIC2_SCL),GPIO.B11(IIC2_SDA)GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //最高输出速度50HzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //输入输出模式为复用功能开漏输出GPIO_Init( GPIOB, &GPIO_InitStructure ); //根据GPIO初始化结构体初始化GPIOB/*初始化IIC2*/I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; //设置为IIC模式I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //设置IIC的占空比,低电平除以高电平值为2I2C_InitStructure.I2C_OwnAddress1 = AT24C02_ADDRESS; //指定第一个设备的地址为7位地址I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //使能ACK信号I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //指定7位地址I2C_InitStructure.I2C_ClockSpeed = 400000; //时钟频率,必须小于等于400KHzI2C_Cmd( I2C2, ENABLE ); //使能IIC2I2C_Init( I2C2, &I2C_InitStructure ); //根据IIC初始化结构体初始化IIC2/*允许一字节一应答模式*/I2C_AcknowledgeConfig( I2C2, ENABLE ); //使能IIC2应答状态
}//*****************************************************
// IIC2写函数 :往IIC设备写入一个BYTE的data
// id :IIC设备的id
// write_address:数据要写入IIC设备的地址
// data :需要写入的数据
//*****************************************************
void I2C2_WriteByte( u8 id, u8 write_address, u8 data )
{while (I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); //当IIC2状态为BUSY时,一直停在这里死循环/*发送START之后要等待,意味着START条件被正确释放,此时IIC总线上没有其它外设*/I2C_GenerateSTART( I2C2, ENABLE ); //一旦不为BUSY,跳出循环,产生START条件 while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); //如果主机被选中(死循环等待ACK信号)/*主机发送地址联系从机后,主机要等待从机的ACK,如果主机设置为发射,*//*则收到ACK信号时 I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED 被置1 */I2C_Send7bitAddress( I2C2, id, I2C_Direction_Transmitter ); //发送从机地址以选择从机,主机为发送模式while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //如果主机发射模式被选中(死循环等待ACK信号)/*通讯建立(生成START过程与从机地址被承认)以后,主机发送数据,*//*如果数据被转移并输出IIC总线,则 I2C_EVENT_MASTER_BYTE_TRANSMITTED 被置1*/I2C_SendData( I2C2, write_address ); //将write_address,即要写的地址通过IIC2发送出去 while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //如果地址已经从IIC2成功发射出去(死循环等待ACK信号)/*往寄存器发送数据data*/I2C_SendData( I2C2, data );while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP( I2C2, ENABLE ); //IIC2产生STOP条件/*循环确保IIC设备与主机的通讯建立*/do{ I2C_GenerateSTART( I2C2, ENABLE ); //IIC2产生START条件I2C_Send7bitAddress( I2C2, AT24C02_ADDRESS, I2C_Direction_Transmitter );//发送EEPROM地址0XA0}while (!(I2C_ReadRegister(I2C2,I2C_Register_SR1)&0x0002)); //读取IIC2->SR1的值,当IIC2->SR1[1] = 1时跳出循环//此时地址发送结束I2C_ClearFlag( I2C2, I2C_FLAG_AF ); //IIC2清除应答错误标志位 I2C_GenerateSTOP( I2C2, ENABLE ); //IIC2产生STOP条件
}//*****************************************************
// IIC2读函数 :从IIC设备的指定地址中读出一个BYTE的数据
// id :IIC设备的id
// read_address :需要读取IIC数据的设备的地址
// 返回值 :读出的数据
//*****************************************************
u8 I2C2_ReadByte( u8 id, u8 read_address )
{ u8 data; /***主机发送地址***/while (I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); //当IIC2状态为BUSY时,一直停在这里死循环/*发送START之后要等待,意味着START条件被正确释放,此时IIC总线上没有其它外设*/I2C_GenerateSTART( I2C2, ENABLE ); //一旦不为BUSY,跳出循环,产生START条件 while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); //如果主机被选中(死循环等待ACK信号)/*主机发送地址联系从机后,主机要等待从机的ACK,如果主机设置为发射,*//*则收到ACK信号时 I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED 被置1 */I2C_Send7bitAddress( I2C2, id, I2C_Direction_Transmitter ); //发送从机地址以选择从机,主机为发送模式while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //如果主机发射模式被选中(死循环等待ACK信号)/*通讯建立(生成START过程与从机地址被承认)以后,主机发送数据,*//*如果数据被转移并输出IIC总线,则 I2C_EVENT_MASTER_BYTE_TRANSMITTED 被置1*/I2C_Cmd( I2C2, ENABLE ); //使能IIC2I2C_SendData( I2C2, read_address ); //将write_address,即要读的地址通过IIC2发送出去while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //如果地址已经从IIC2成功发射出去(死循环等待ACK信号?I2C_GenerateSTART( I2C2, ENABLE ); //产生START条件while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); //如果主机被选中(死循环等待ACK信号)/***主机接收数据***/I2C_Send7bitAddress( I2C2, id, I2C_Direction_Receiver ); //主机设置为接收模式while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //如果主机接收模式被选中(死循环等待ACK信号)I2C_AcknowledgeConfig( I2C2, DISABLE ); //失能IIC2的应答状态I2C_GenerateSTOP( I2C2, ENABLE ); //产生STOP条件while (!(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED))); //如果主机接收数据成功(死循环等待ACK信号)data = I2C_ReceiveData(I2C2); //返回IIC2接收的数据,赋给tempI2C_AcknowledgeConfig( I2C2, ENABLE ); //再一次使能IIC2的应答状态return data; //返回接收到的数据
}
以下是iic.h中的内容:
#ifndef _IIC_H
#define _IIC_H#include "sys.h"/*EEPROM芯片AT24C02的芯片地址*/
#define AT24C02_ADDRESS 0XA0void I2C2_Init(void);
void I2C2_WriteByte( u8 id, u8 write_address, u8 data );
u8 I2C2_ReadByte( u8 id, u8 read_address );#endif
以上iic部分代码参考了:http://www.amobbs.com/thread-5492914-1-1.html
STM32自带的IIC配置相关推荐
- STM32的SPI及IIC
目录 STM32的SPI及IIC 1.SPI的配置方式 SPI**简介** SPI**特征** SPI**功能描述** SPI通信配置 2.IIC 的配置方式 IIC简介 I2C 初始化结构体详解 I ...
- STM32芯片IO口的配置以及上拉下拉电阻介绍(一)
STM32芯片IO口的配置以及上拉下拉电阻介绍(一) IO口常见的配置方式 推挽输出 开漏输出 STM32芯片做硬件研发的朋友们都知道.但是还是有很多做硬件的新朋友"只知其然而不知其所然&q ...
- STM32 HAL I2C(IIC)通信的序列传输(restart condition)
STM32 HAL I2C(IIC)通信的序列(Seq)传输函数(restart condition) neozng1@hnu.edu.cn 文章目录 STM32 HAL I2C(IIC)通信的序列( ...
- STM32——CAN控制器原理与配置
一.CAN控制器简介 STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下: 1.支持CAN协议2.0A和2.0B主动模式 2.波特率最高达1Mbps 3.支持时间触发通信 4.具 ...
- 【STM32】新建工程模板及配置
系列文章目录 ·[STM32]新建工程模板及配置 ·[STM32]STM32与PC端.HC-06.ROS进行USART串口通信 ·[ROS]ROS上位机使用Serial库和boost::asio库与S ...
- LWIP学习系列(二):STM32中ETH外设的配置与LWIP的结合使用
目录 一.STM32中ETH外设的配置流程(HAL库) (1)ETH大致初始化与使用流程 (2)访问外部PHY寄存器相关函数 二.LWIP关于ethernet的底层驱动移植 (1)LWIP网卡需要由用 ...
- STM32位带区和位带别名区的浅谈
1.首先谈下为什么要使用位带? 在学习51单片机时就已经使用过位操作,比如使用sbit对单片机IO口的定义,但是STM32中并没有这类关键字,而是通过访问位带别名区来实现,即通过将每个比特位膨胀成一个 ...
- 【STM32笔记】低功耗模式配置及避坑汇总
[STM32笔记]低功耗模式配置及配置汇总 文章总结:(后续更新以相关文章为准) [STM32笔记]低功耗模式.WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断) [STM32 ...
- 基于stm32单片机的模拟IIC时序(附源码)
我下面要说的是基于stm32单片机的模拟IIC时序,以及是一些要注意的事项:结合自己所做的MMA7455加速度传感器,我把模拟IIC的源代码贴了出来,大家可以参考一下. 1.因为在IIC协议中,当总线 ...
最新文章
- 「二本生逆袭」引知乎热议,读博后三年两次发Nature,第一学历有那么重要吗?...
- 计算机ui答辩,KGUT1027 班级UI设计第一阶段成长答辩开始啦
- Daily Scrum 10.26
- 142. Leetcode 93. 复原 IP 地址 (回溯算法-切割问题)
- Java中设计模式之生产者消费者模式-3
- libnss mysql_Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式)
- [转]CTO谈豆瓣网和校内网技术架构变迁
- windows10按键映射PowerToys
- 思科路由器的双出口nat研究
- C# LISTVIEW实例:文件图标显示
- 网易mumu模拟器禁止更新/屏蔽更新方法
- (附源码)ssm 座位管理系统 毕业设计 250858
- vue.js实现带表情评论功能前后端实现(仿B站评论)
- mysql 1677错误_[转载]MySQL 5.5.12 row格式复制下从库结构变更引发1677错误一则
- 论文的关键词应该如何选取?
- el-dialog组件实现可以拖拽移动功能
- 十、纺织品库存管理系统全部功能展示
- 修复python3.6.13+django2.2+djangorestframework 3.12.4 使用djangorestframework_simplejwt-4.4.0-py3时的两个bug
- 我真希望你在参加面试前看到这篇文章
- listview连接mysql_ListView 数据库 C
热门文章
- kinit: Bad encryption type while getting initial credentials
- 应用在飞机的导航系统上的计算机,惯性导航在飞机上的应用
- 关于原型图的深入理解
- 联发科MT6853和MT6873有什么区别?
- C#麦克风录音组件与播放源码
- 基于JAVA校园流浪猫图鉴管理系统的设计与实现计算机毕业设计源码+系统+数据库+lw文档+部署
- JS实现一个简单的抽奖系统
- Python3 从零单排13_re模块
- OSChina 周五乱弹 ——大家好,我叫风油米青
- 大厂技术专家:云原生与软件供应链安全的思考