以下是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配置相关推荐

  1. STM32的SPI及IIC

    目录 STM32的SPI及IIC 1.SPI的配置方式 SPI**简介** SPI**特征** SPI**功能描述** SPI通信配置 2.IIC 的配置方式 IIC简介 I2C 初始化结构体详解 I ...

  2. STM32芯片IO口的配置以及上拉下拉电阻介绍(一)

    STM32芯片IO口的配置以及上拉下拉电阻介绍(一) IO口常见的配置方式 推挽输出 开漏输出 STM32芯片做硬件研发的朋友们都知道.但是还是有很多做硬件的新朋友"只知其然而不知其所然&q ...

  3. STM32 HAL I2C(IIC)通信的序列传输(restart condition)

    STM32 HAL I2C(IIC)通信的序列(Seq)传输函数(restart condition) neozng1@hnu.edu.cn 文章目录 STM32 HAL I2C(IIC)通信的序列( ...

  4. STM32——CAN控制器原理与配置

    一.CAN控制器简介 STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下: 1.支持CAN协议2.0A和2.0B主动模式 2.波特率最高达1Mbps 3.支持时间触发通信 4.具 ...

  5. 【STM32】新建工程模板及配置

    系列文章目录 ·[STM32]新建工程模板及配置 ·[STM32]STM32与PC端.HC-06.ROS进行USART串口通信 ·[ROS]ROS上位机使用Serial库和boost::asio库与S ...

  6. LWIP学习系列(二):STM32中ETH外设的配置与LWIP的结合使用

    目录 一.STM32中ETH外设的配置流程(HAL库) (1)ETH大致初始化与使用流程 (2)访问外部PHY寄存器相关函数 二.LWIP关于ethernet的底层驱动移植 (1)LWIP网卡需要由用 ...

  7. STM32位带区和位带别名区的浅谈

    1.首先谈下为什么要使用位带? 在学习51单片机时就已经使用过位操作,比如使用sbit对单片机IO口的定义,但是STM32中并没有这类关键字,而是通过访问位带别名区来实现,即通过将每个比特位膨胀成一个 ...

  8. 【STM32笔记】低功耗模式配置及避坑汇总

    [STM32笔记]低功耗模式配置及配置汇总 文章总结:(后续更新以相关文章为准) [STM32笔记]低功耗模式.WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断) [STM32 ...

  9. 基于stm32单片机的模拟IIC时序(附源码)

    我下面要说的是基于stm32单片机的模拟IIC时序,以及是一些要注意的事项:结合自己所做的MMA7455加速度传感器,我把模拟IIC的源代码贴了出来,大家可以参考一下. 1.因为在IIC协议中,当总线 ...

最新文章

  1. 「二本生逆袭」引知乎热议,读博后三年两次发Nature,第一学历有那么重要吗?...
  2. 计算机ui答辩,KGUT1027 班级UI设计第一阶段成长答辩开始啦
  3. Daily Scrum 10.26
  4. 142. Leetcode 93. 复原 IP 地址 (回溯算法-切割问题)
  5. Java中设计模式之生产者消费者模式-3
  6. libnss mysql_Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式)
  7. [转]CTO谈豆瓣网和校内网技术架构变迁
  8. windows10按键映射PowerToys
  9. 思科路由器的双出口nat研究
  10. C# LISTVIEW实例:文件图标显示
  11. 网易mumu模拟器禁止更新/屏蔽更新方法
  12. (附源码)ssm 座位管理系统 毕业设计 250858
  13. vue.js实现带表情评论功能前后端实现(仿B站评论)
  14. mysql 1677错误_[转载]MySQL 5.5.12 row格式复制下从库结构变更引发1677错误一则
  15. 论文的关键词应该如何选取?
  16. el-dialog组件实现可以拖拽移动功能
  17. 十、纺织品库存管理系统全部功能展示
  18. 修复python3.6.13+django2.2+djangorestframework 3.12.4 使用djangorestframework_simplejwt-4.4.0-py3时的两个bug
  19. 我真希望你在参加面试前看到这篇文章
  20. listview连接mysql_ListView 数据库 C

热门文章

  1. kinit: Bad encryption type while getting initial credentials
  2. 应用在飞机的导航系统上的计算机,惯性导航在飞机上的应用
  3. 关于原型图的深入理解
  4. 联发科MT6853和MT6873有什么区别?
  5. C#麦克风录音组件与播放源码
  6. 基于JAVA校园流浪猫图鉴管理系统的设计与实现计算机毕业设计源码+系统+数据库+lw文档+部署
  7. JS实现一个简单的抽奖系统
  8. Python3 从零单排13_re模块
  9. OSChina 周五乱弹 ——大家好,我叫风油米青
  10. 大厂技术专家:云原生与软件供应链安全的思考