零死角玩转stm32-中级篇5、IIC(EEPROM)

合集下载

STM32开发之STM32硬件IIC操作

STM32开发之STM32硬件IIC操作
1.对于硬件IIC的初始化流程包括
1.配置IO口,配置为GPIO_Mode_AF_OD模式
2.选择IIC模式
3.选择是否使能自动应答以及设备地址长度
4.设置IIC总线的传输速率
2.硬件IIC的读写操作其实逻辑上和标准总线类似,也是发送地址等待ack
发送数据等待ACK,但是因为有硬件的自动参与,所以我们不需要延时了
/*I2C1初始化*/
I2C_Init(I2C1,&I2C_InitStructure);
/*使能I2C1*/
I2C_Cmd(I2C1,ENABLE);
/*允许应答模式*/
I2C_AcknowledgeConfig(I2C1,ENABLE);
}
voidHmcByteWrite(u8addr,u8dataValue)
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;
虽然很多人说STM的硬件IIC不好用,但是对于这幺一个设备去探索一下
还是很有必要的,指不定哪天就用上了呢,
IIC借口一共有九个寄存器,比较重要的几个寄存器分别如下
1.CR1
由这几个位我们可以正常产生标准IIC的START条件STOP条件,ACK与
NOACK
CR2
控制IIC的通行频率
这两位检测IIC总线是否收到数据
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE

零死角玩转stm32-中级篇2、ADC(DMA模式)

零死角玩转stm32-中级篇2、ADC(DMA模式)

0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。

M3的世界,与野火同行,乐意惬无边。

另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。

内容上会给你带来更多的惊喜。

是一本学习STM32必备的工具书。

敬请期待!2、ADC(DMA模式)2.1 ADC简介ADC (Analog to Digital Converter),模/数转换器。

在模拟信号需要以数字形式处理、存储或传输时,模/数转换器几乎必不可少。

STM32在片上集成的ADC外设非常强大。

在STM32F103xC、STM32F103xD和STM32F103xE增强型产品,内嵌3个12位的ADC,每个ADC共用多达21个外部通道,可以实现单次或多次扫描转换。

如野火STM32开发板用的是STM32F103VET6,属于增强型的CPU,它有18个通道,可测量16个外部和2个内部信号源。

各通道的A/D转换可以单次、连续、扫描或间断模式执行。

ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。

2.2 STM32的ADC主要技术指标对于ADC来说,我们最关注的就是它的分辨率、转换速度、ADC类型、参考电压范围。

●分辨率12位分辨率。

不能直接测量负电压,所以没有符号位,即其最小量化单位LSB = V ref+ / 212。

●转换时间转换时间是可编程的。

采样一次至少要用14个ADC时钟周期,而ADC的时钟频率最高为14MHz,也就是说,它的采样时间最短为1us。

足以胜任中、低频数字示波器的采样工作。

●ADC类型ADC的类型决定了它性能的极限,STM32的是逐次比较型ADC。

STM32模拟iic驱动eeprom24c128

STM32模拟iic驱动eeprom24c128

STM32模拟iic驱动eeprom24c128void IIC_Init(void) //IIC初始化函数{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//使能GPIOB时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOE, &GPIO_InitStructure);GPIO_SetBits(GPIOE,GPIO_Pin_2|GPIO_Pin_3); //PE2,PE3 输出高}void IIC_Start(void) //IIC开始函数{SDA_OUT(); //sda线输出IIC_SDA=1;IIC_SCL=1;delay_us(5);IIC_SDA=0;//START:when CLK is high,DATA change form high to lowdelay_us(5);IIC_SCL=0; //钳住I2C总线,准备发送或接收数据}void IIC_Stop(void) //IIC停止函数{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(5);IIC_SCL=1;IIC_SDA=1;//发送I2C总线结束信号delay_us(5);}u8 IIC_Wait_Ack(void) //等待应答{u8 ucErrTime=0;SDA_IN(); //SDA设置为输入IIC_SDA=1;delay_us(5);IIC_SCL=1;delay_us(1);while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;//时钟输出0return 0;}void IIC_Ack(void) //SDA输出低电平,IIC应答{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(4);IIC_SCL=0;}void IIC_NAck(void) //SDA输出高电平,IIC非应答{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(4);IIC_SCL=0;}void IIC_Send_Byte(u8 txd) //IIC发送一个字节{u8 t;SDA_OUT(); //数据线输出模式IIC_SCL=0; //拉低时钟开始数据传输for(t=0;t<8;t++){IIC_SDA=(txd&0x80)>>7;txd<<=1;delay_us(5); //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(5);IIC_SCL=0;delay_us(5);}}u8 IIC_Read_Byte(unsigned char ack) //IIC读取一个字节{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL=0;delay_us(5);IIC_SCL=1;receive<<=1;if(READ_SDA){receive++;}delay_us(5);}if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACKreturn receive;}void AT24CXX_Init(void) //AT254C128初始化{IIC_Init();}u8 AT24CXX_ReadOneByte(u16 ReadAddr) //AT24C128读取一个字节{u8 temp=0;IIC_Start();IIC_Send_Byte(0XA0); //发送写命令IIC_Wait_Ack();IIC_Send_Byte(ReadAddr>>8);//发送高地址IIC_Wait_Ack();IIC_Send_Byte(ReadAddr%256); //发送低地址IIC_Wait_Ack();IIC_Start();IIC_Send_Byte(0XA1); //进入接收模式IIC_Wait_Ack();temp=IIC_Read_Byte(0);IIC_Stop(); //产生一个停止条件return temp;}void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite) {IIC_Start();IIC_Send_Byte(0XA0); //发送写命令IIC_Wait_Ack();IIC_Send_Byte(WriteAddr>>8);//发送高地址IIC_Wait_Ack();IIC_Send_Byte(WriteAddr%256); //发送低地址IIC_Wait_Ack();IIC_Send_Byte(DataToWrite); //发送字节IIC_Wait_Ack();IIC_Stop();//产生一个停止条件delay_ms(20);}u8 AT24CXX_Check(void){u8 temp;temp=AT24CXX_ReadOneByte(12333);//避免每次开机都写AT24CXXif(temp==0X55){return 0;}else//排除第一次初始化的情况{AT24CXX_WriteOneByte(12333,0X55);temp=AT24CXX_ReadOneByte(12333);if(temp==0X55){return 0;}}return 1;}void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead) {while(NumToRead){*pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);NumToRead--;}}void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite) {while(NumToWrite--){AT24CXX_WriteOneByte(WriteAddr,*pBuffer);WriteAddr++;pBuffer++;}}BY MaiLaoDie。

STM32之EEPROM驱动

STM32之EEPROM驱动

STM32之EEPROM驱动本⽂介绍如何使⽤STM32标准外设库驱动EEPROM,本例程驱动的EEPROM为AT24C02,通讯协议为IIC,使⽤IO⼝模拟⽅式。

本⽂适合对单⽚机及C语⾔有⼀定基础的开发⼈员阅读,MCU使⽤STM32F103VE系列。

1. EEPROM简介EEPROM全称为EEPROM(Electrically Erasable Programmable Read Only Memory)是电可擦除可编程只读存储器。

虽然名称为只读存储器,但是擦除和写⼊都是直接使⽤电路控制,不需要再使⽤外部设备来擦写,即设备在运⾏过程中即可随时擦除和写⼊。

可以按字节为单位修改数据,⽆需整个芯⽚擦除,且掉电后数据不丢失,⼀般⽤来存储⼀些配置信息,以便系统重新上电的时候加载。

2. 常⽤EEPROM⼀般常⽤的EEPROM为ATMEL公司(已被Microchip收购)的AT24Cxx系列,常⽤容量从1K到64Kbit不等,换算成字节为128到8K Bytes,可以根据项⽬需求和价格综合考虑选型。

3. EEPROM操作说明AT24C02容量为2Kbit,即256Byte,地址范围为0~255,即0~0xFF,使⽤1个字节即可表⽰,因此地址长度为1字节。

3.1. 通讯⽅式IAT24C02使⽤IIC协议跟MCU通讯。

3.2. 设备地址如果仅接⼊⼀个AT24C02,可以将设备的A0、A1、A2引脚全部接⼊低电平,那么此时该设备的地位为0x50,再增加⼀位读写标志位,最终读取操作时地址为0xA1,写⼊操作时地址为0xA0。

3.3. 读取数据读取当前字节:MCU直接发起读操作,设备返回当前字节,当前字节⾃动加1,该操作较少使⽤。

读取指定地址⼀个字节:MCU先向AT24C02写⼊⼀个地址,然后再发起⼀个读操作,AT24C02返回该地址存储的字节。

连续读取:MCU发起读当前字节,或者读指定地址字节,设备返回数据,MCU发送ACK,设备继续返回后续地址数据,直到MCU发送NACK,设备不再返回数据。

基于STM32的IIC_EEPROM案例说明

基于STM32的IIC_EEPROM案例说明

IIC_EEPROM说明书
一:原理图
IIC_EEPROM电路图
二:工作原理
使用IIC控制器读写IIC_EEPROM中的数据。

开启IIC控制器,IIC_SCL产生正确的时序,通过判断总线的状态,通过IIC_SDA传输数据。

请参考《STM32中文参考资料》的IIC相关内容。

三:实验现象及操作
本实验使用使用串口通信显示数据。

在上位机上打开串口助手,波特率设置为115200,无校验。

串口助手中使用文本接受模式。

按RESET键后,可发现串口助手接受区中显示,“这是一个IIC_EEPROM测试例程”字符串;
在按下一次K3键,程序网IIC_EEPROM中写入0x00,0x01,0x02,0x03等等共20个数据,在串口助手中有显示,然后会自动读取IIC_EEPROM中的数据并发送给PC机;
若再次按下K3键,数据会乘2再写入;
再按下K3键,数据则会乘3再写入;
依次类推。

基于STM32的IIC_EEPROM案例说明

基于STM32的IIC_EEPROM案例说明

基于STM32的IIC_EEPROM案例说明STM32是一系列由STMicroelectronics开发的32位ARM Cortex-M处理器的微控制器。

它具有高性能、低功耗和丰富的外设。

其中一个外设是I2C接口,可以用于连接外部器件,如EEPROM。

EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以通过电量抹除并重新编程。

本文将说明如何在STM32微控制器上使用I2C接口来读取和写入EEPROM的数据。

以下是一个I2CEEPROM案例的步骤:1.硬件连接:找到适当的引脚连接STM32和EEPROM。

根据STM32型号和EEPROM的规格书,将SCL引脚连接到STM32的相应引脚,将SDA引脚连接到STM32的相应引脚。

确保EEPROM上的地址引脚正确连接到STM32的引脚,以选择EEPROM的地址。

另外,确保STM32的引脚配置正确。

2.初始化I2C外设:在STM32的代码中,首先需要初始化I2C外设。

这可以通过配置I2C控制器的寄存器来完成。

这些寄存器包含有关时钟速度、地址模式和使能I2C控制器的设置选项。

3.选择EEPROM地址:通过向I2C总线发送一个特定的命令字节,可以选择EEPROM的地址。

这个命令字节包含I2C总线上的设备地址和寻址模式。

4.读取EEPROM数据:为了从EEPROM读取数据,STM32将发送一个读取命令字节,将该命令字节传送到EEPROM,然后从EEPROM读取数据。

在读取数据之前,需要设置读取数据的长度和目标缓冲区。

5.写入EEPROM数据:为了向EEPROM写入数据,STM32将发送一个写入命令字节,将该命令字节传送到EEPROM,然后将数据写入EEPROM。

在写入数据之前,需要设置写入数据的长度和源缓冲区。

6.处理错误和超时:在进行I2CEEPROM读取和写入操作时,可能会出现错误和超时。

STM32F4利用I2C向EEPROM写入、读取数据步骤

STM32F4利用I2C向EEPROM写入、读取数据步骤

STM32F4利⽤I2C向EEPROM写⼊、读取数据步骤
写⼊⼀个字节:
第⼀步:使⽤库函数I2C_GenerateSTART()产⽣I2C起始信号,调⽤库函数I2C_CheckEvent()检测事件,若检测到下⼀事件,则进⼊通讯下⼀阶段
第⼆步:调⽤库函数I2C_Send7bitAddress()发送EEPROM的设备地址,并把数据传输⽅向设置为I2C_Direction_Transmitter(即发送⽅向),发送地址后以同样的⽅式检测相应的事件。

第三步:调⽤库函数I2C_SendData向EEPROM发送要写⼊的地址,发送完后等待EV8事件的产⽣。

第四步:继续调⽤库函数I2C_SendData向EEPROM发送要写⼊的数据,然后等待EV8事件的产⽣。

第五步:通讯结束,调⽤I2C_GenerateSTOP发送停⽌信号。

读取⼀字节的数据:
第⼀步:通过库函数I2C_GETFlagStatus()查询库函数是否处于忙碌状态,若不忙碌,则进⼊下⼀状态。

第⼆步:使⽤库函数I2C_GenerateSTART()产⽣起始信号,调⽤库函数I2C_CheckEvent()检测Event1,若检测成功则进⼊下⼀阶段。

第三步:发送EEPROM的设备地址,⽅向为I2C_Direction_Transmitter(即写⽅向),检测事件6
第四步:利⽤库函数I2C_Cmd重新使能I2C外设
第五步:利⽤库函数I2C_Senddata()发送要读取的EEPROM的内部地址,检测Event8事件的产⽣
第六步:产⽣第⼆次I2C起始信号,并检测相关事件
第七步:发送I2C设备地址
第⼋步:读取数据。

IIC EEPROM程序详细解释

IIC EEPROM程序详细解释

#include <intrins.h>//头文件#include <AT89X52.h>#include "xxxxxx.h" //自己设定头文件名字,来做模块使用#define uchar unisgned char#define uint unsigned int/*//////////////////////////////////////////////////////////////////////////////////////////IIC与EEPROM模块///////////////////////////////////////////////////////////////////////////////////////////////*//*///////////////////////////////////////////////////////////////////////////////////////延时///////////////////////////////////////////////////////////////////////////////////////////////////*/void delayms(uint ms)// 延时子程序{uchar k;while(ms--){for(k = 0; k < 120; k++);}}void delay(void){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}void delay1(void){uint a=3000;while(a--);}/*///////////////////////////////////////////////////////////////////////////////////起始start/////////////////////////////////////////////////////////////////////////////////////////*/void start (void){SCL = 1;delay();SDA = 1; //在SCL(时间线)=1时SDA(数据线)=1跳变到=0 为起始。

I2C读写EEPROM 问题总结

I2C读写EEPROM 问题总结

2017年6月30日星期五目的:利用TMS320F2801芯片上外设I2C(2线串口)读写EEPROM数据(24LC128)关键点1:24LC时钟频率400KHz,寄存器设置如下:I2caRegs.I2CPSC.all = 9; // Prescaler - need 7-12 Mhz on module clk I2caRegs.I2CCLKL = 10; // NOTE: must be non zeroI2caRegs.I2CCLKH = 5; // NOTE: must be non zero时钟频率也可设为200KHz,三个参数分别为9、20、20(CPU时钟频率为100MHz)(未测试)关键点2:波形分析问题:I2C模块是不是只有I2CCNT 减到0才会发出停止信号??I2C模块是硬件的,当检测到发送完了就会发结束自动发信号,不需要人为干预问题1:字节写操作正常,但是字节读函数出错原因:写EEPROM是在七位器件地址后添加写标志,而读EEPROM需要在七位器件地址后添加写标志。

关键点:读EEPROM数据需要发送两次命令。

第一次为写地址(此地址会被赋值给EEPROM 内的地址指针),因此需要添加写标志;第二次为读数据,将写标志改为读标志。

问题2:主机接收时,SDA数据线上有数据传输,且I2CDRR接收数据寄存器有数据更新,但寄存器显示不可读,即CPU认为一直没接收到数据,一直停在下面语句while关键点:初始化设置时采用的是FIFO接收方式,因此无效,应查询FIFO接收中断位while 方式查询位。

此位只有在非FIFO中断接收方式时才有效。

问题3:断续单字节读写正常,但是采用连续的单字节读写出错。

原因:EEPROM写过程的结束并不是I2C总线写结束就结束,实际上I2C总线的写入数据先被保存到了EEPROM内部的缓冲区,当遇到I2C结束条件后,EEPROM才启动内部写过程,这个过程才是保存数据的过程。

STM32重难点-IIC原理及应用详细步骤

STM32重难点-IIC原理及应用详细步骤

STM32重难点-IIC原理及应⽤详细步骤IIC原理及应⽤详细步骤IIC概述IIC介绍I2C(IIC,Inter-Integrated Circuit),两线式串⾏总线,由PHILIPS公司开发⽤于连接微控制器及其外围设备。

它是由数据线SDA和时钟SCL 构成的串⾏总线,可发送和接收数据。

在CPU与被控IC之间、IC与IC之间进⾏双向传送,⾼速IIC总线⼀般可达400kbps以上。

是半双⼯通信⽅式。

IIC特性相对于UART,IIC的优点在于可以⼀对多,缺点在于⽆论主从器件均不对消息进⾏确认。

模拟IIC优点是可以任意选择SDA和SCL,不受管脚限制⽽⽐较灵活。

它的缺点是不可⽤DMA。

硬件IIC优点是可⽤DMA减轻CPU负担,速度也⽐模拟IIC快,但是实际调试时可能会出现死锁。

IIC时钟信号是由主控器件产⽣,所有接到IIC总线设备上的串⾏数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL 上。

对于并联在⼀条总线上的每个IC都有唯⼀的地址。

⼀般情况下,数据线SDA和时钟线SCL都是处于上拉电阻状态。

因为:在总线空闲状态时,这两根线⼀般被上⾯所接的上拉电阻拉⾼,保持着⾼电平。

IIC各种状态解析空闲状态I2C总线总线的SDA和SCL两条信号线同时处于⾼电平时,规定为总线的空闲状态。

此时各个器件的输出级场效应管均处在截⽌状态,即释放总线,由两条信号线各⾃的上拉电阻把电平拉⾼。

开/起始信号(必须的)当SCL为⾼期间,SDA由⾼到低的跳变;启动信号是⼀种电平跳变(边沿触发)时序信号,⽽不是⼀个 电平信号。

停⽌信号(⾮必须)当SCL为⾼期间,SDA由低到⾼的跳变;停⽌信号也是⼀种电平跳变时序信号,⽽不是⼀个电平信号。

应答信号(⾮必须)发送器每发送⼀个字节,就在时钟脉冲9期间释放数据线,由接收器反馈⼀个应答信号。

应答信号为低电平时,规定为有效应答位(ACK简称应答位),表⽰接收器已经成功地接收了该字节;应答信号为⾼电平时,规定为⾮应答位(NACK),⼀般表⽰接收器接收该字节没有成功。

stm32 硬件iic原理

stm32 硬件iic原理

stm32 硬件iic原理STM32是一款广泛应用于嵌入式系统开发的微控制器,具有丰富的外设和强大的处理能力。

其中,硬件IIC(Inter-Integrated Circuit)是一种重要的通信接口,它能够实现微控制器与其他外部设备之间的数据交换。

本文将从STM32硬件IIC的原理入手,介绍其工作原理以及相关应用。

一、STM32硬件IIC简介STM32硬件IIC是指STM32微控制器上集成的硬件IIC接口,它是一种串行通信接口,由两条线路组成:SDA(Serial Data)和SCL(Serial Clock)。

其中,SDA线用于数据传输,而SCL线用于同步时钟信号的传输。

通过这两条线路,STM32可以与其他器件进行数据的收发。

二、STM32硬件IIC的工作原理1. 起始信号和停止信号在IIC通信中,数据的传输始于起始信号,终于停止信号。

起始信号由高电平到低电平的跳变而形成,而停止信号由低电平到高电平的跳变而形成。

2. 数据的传输数据的传输是通过时钟信号来同步的。

在传输一个字节的过程中,STM32作为主设备控制时钟信号的产生和数据的读写。

每当产生一个时钟脉冲,数据线上的数据就会被读取或写入。

3. 数据的确认在每传输一个字节后,接收设备会返回一个应答信号,用于确认数据是否成功接收。

应答信号由接收设备拉低数据线来表示,而主设备通过读取数据线上的电平来判断是否接收到应答信号。

三、STM32硬件IIC的应用STM32硬件IIC广泛应用于各种外设的控制和通信。

以下是一些常见的应用场景:1. 传感器数据采集通过连接传感器到STM32的硬件IIC接口,可以方便地采集传感器的数据。

例如,温湿度传感器、光照传感器等,通过IIC接口将数据传输到STM32,然后进行处理和存储。

2. 外部存储器控制将外部存储器(如EEPROM、Flash等)连接到STM32的硬件IIC 接口,可以实现对存储器的读写操作。

这在数据存储和固件升级等场景下非常有用。

STM32系列IIC使用总结

STM32系列IIC使用总结

STM32系列IIC使用总结STM32系列是意法半导体公司推出的一款32位ARM Cortex-M微控制器系列产品,广泛应用于各类嵌入式系统中。

其中,IIC总线是STM32系列产品中常用的通信接口之一,用于连接各种外部设备,如传感器、存储器、LCD显示屏等。

下面是对STM32系列IIC使用的总结。

一、STM32IIC硬件功能1. IIC接口引脚:STM32的IIC接口引脚有两个,分别是SDA(Serial Data)和SCL(Serial Clock)。

2.多主机模式支持:STM32的IIC接口支持多主机模式,可以实现多个主机同时操作同一个从机设备。

3. 速率控制:STM32的IIC接口支持多种速率配置,包括标准模式(100Kbps)、快速模式(400Kbps)和高速模式(1Mbps)等。

4.IIC总线协议支持:STM32的IIC接口遵循I2C总线协议,支持7位或10位设备地址,支持字节读写、页写、设备寻址等操作。

二、STM32IIC软件开发步骤1.初始化IIC接口:使用STM32提供的库函数,配置IIC引脚为复用功能,并初始化IIC控制器的寄存器,包括速率设置、硬件过滤器配置等。

2.开启IIC总线:调用库函数,使能IIC总线,准备进行通信。

3.生成起始位和停止位:调用库函数,发送起始位和停止位信号,控制IIC总线的起始和停止状态。

4.发送器件地址:调用库函数,发送要操作的设备的地址信息,用于将总线上的控制权交给该设备。

5.发送数据或接收数据:调用库函数,根据需要发送数据或接收数据,并处理数据的传输错误等异常情况。

6.关闭IIC总线:调用库函数,关闭IIC总线,释放总线资源。

三、处理IIC通信中的常见问题1.电源电压:STM32的IIC接口对电源电压要求较高,通常工作电压为3.3V,要确保供电电压稳定。

2.设备地址:在使用IIC接口时,需要正确设置设备的地址信息,确保与从机设备进行正常通信。

3.速率设置:根据实际需求,选择合适的通信速率,避免传输错误和数据丢失。

stm32之IIC应用

stm32之IIC应用

stm32之IIC应⽤stm32 之IIC应⽤iic协议是⽐较简单的双线协议,时钟线CLK和数据线SDA。

⼀般我们常见的还有spi总线,这种总线可以可以根据需要扩展,还有单总线等等这次还以at240c2为例进⾏操作!PS:这就是传说中的iic时序图硬件构造我们不过多的分析,今天⽤到库了!我们先从库函数硬件iic初始化说起!PB6 -- CLKPB7 -- SDA[cpp]view plaincopyprint?1. void i2c_init(u8 addr,u32 clock)2. {3. I2C_InitTypeDef i2c;4. RCC->APB2ENR |= 1<<3;5. GPIOB->CRL |= (u32)0xff<<(6*4);6.7. RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);8. i2c.I2C_Ack = I2C_Ack_Enable;9. i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;10. i2c.I2C_ClockSpeed = clock*1000;11. i2c.I2C_DutyCycle = I2C_DutyCycle_2;12. i2c.I2C_Mode = I2C_Mode_I2C;13. i2c.I2C_OwnAddress1 = addr;14.15. I2C_Cmd(I2C1,ENABLE);16. I2C_Init(I2C1,&i2c);17. }在配置管脚⽅⾯,我还是喜欢⽤寄存器配置,因为我的两⾏代码可以解决库函数的N多⾏代码的问题!还有在结构体变量命名⽅⾯也是属于我⾃⼰的独创吧,这样反正我觉得是既容易识别,也少打⼏个字!typedef struct{uint32_t I2C_ClockSpeed; //I2C时钟频率设置uint16_t I2C_Mode; //I2C模式设置uint16_t I2C_DutyCycle; //⾼低电平时间之⽐uint16_t I2C_OwnAddress1; //主设备地址设置,也就是⾃⼰的地址uint16_t I2C_Ack; //Checkuint16_t I2C_AcknowledgedAddress; //地址长度,可以为7bit的也可以为10bit的}I2C_InitTypeDef;IIC初始化完之后,我们开始来研究eeprom看完这个写⼀个字节的协议之后,我们应该对这个写已经没有什么问题了,很简单的。

基于STM32F103的I2C总线EEPROM的读写(带超时检测)

基于STM32F103的I2C总线EEPROM的读写(带超时检测)

基于STM32F103的I2C总线EEPROM的读写(带超时检测)————————————————————————————————作者:————————————————————————————————日期:【原创】基于STM32F103的I2C总线EEPROM的读写(带超时检测)本人最近参考了st 公司关于STM32的I2C的例程,觉得不是很适合我的应用,于是自己写了一个基于STM32F103的I2C总线EEPROM(24C256)的读写程序,总线的最高速度可达400K,现在将源代码原原本本的公布如下,希望得到高手的指点,也希望能够给和我有同样想法的同仁们一些参考价值。

注意:最好将固件库升级一下,st网站上面有V2。

03库的补丁。

u32 ulTimeOut_Time;/***********************************************************************************************************I2C_EE_WriteStr()** Description : 将一个数据块写入EEPROM 的指定的地址**Argument(s) : xChip - 从器件地址* xAddr — EEPROM存储空间地址*xpBuf —数据缓冲区指针* xLen - 数据长度**Return(s) : none.**Caller(s) : Application.** Note(s) :(1)*——--—-——----————--—-——---——--—--—---—-—----———--—-—-————-——-——---—-—--—————----——--—————-—-——--——-———--*Modified by :* Modified date :* Description :*—---———----———-—------——--—--—-——————-—-————-——-———-——---—--——-——————--—————----———-—---—-——-——-—-——--—**********************************************************************************************************/void I2C_EE_WriteStr(u8 xChip, u16 xAddr, u8 *xpBuf, u16 xLen){u8 *pbuf;u8 err;u8 retry;u16 addr;u16 len;个人收集整理,勿做商业用途本文为互联网收集,请勿用作商业用途//pbuf = xpBuf;addr = xAddr;len = xLen;I2C_EE_Drv_BusEn(); // 允许总线,写允许retry = 5; // 重试5次while(len){err = I2C_EE_Drv_WriteByte(xChip,addr, *pbuf);if(err){if(--retry == 0 ) // 已经试了5次,写下一个数据{retry = 5;pbuf++;addr++;len——;}}else // 顺利,写下一个数据{pbuf++;addr++;len--;}}I2C_EE_Drv_BusDis(); // 失能总线,写保护}/*********************************************************************************************************** I2C_EE_ReadStr()**Description :从EEPROM 的指定的地址读出一个数据块** Argument(s) : xChip —从器件地址* xAddr - EEPROM存储空间地址*xpBuf - 数据缓冲区指针*xLen - 数据长度**Return(s) : none.** Caller(s) : Application。

IIC技术文档

IIC技术文档

STM32 硬件IIC读写EEPROM作者:王纯1、IIC硬件结构如下图应用STM32的硬件来读写EEPROM实现数据的掉电存储2、EEPROM的硬件结构AT24C32的一页字节数为32字节,页字节数取决于被访问芯片在一个写周期内所能编程的最大字节数。

页写入,单片机先发送启动信号。

接着发送1个字节的控制字,再发送2个字节的起始地址,上述各字节均得到应答后就可以发送最多1页的数据。

每发送一个字节数据要求EEPROM应答,最后以停止信号结束。

同时激活EEPROM内部定时写周期。

在内部定时写周期对EEPROM的输入无效,写周期结束就会给出应答信号。

3、程序解读//While there is data to be writtenwhile(NumByteToWrite--){//Send the current byteI2C_SendData(I2C2, *pBuffer);pBuffer++;//Test on EV8 and clear itwhile(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));}/* Send STOP condition */I2C_GenerateSTOP(I2C2, ENABLE);如果一页写入,这里NumByteToWrite==32一次性写入32字节的数据。

每发一个数据等一个应答。

32字节数据发送完成,发一个停止信号激活EEPROM内部定时写周期。

I2C_EE_WaitEepromStandbyState();// 等待EEPROM为待命状态这样就避免马上读EEPROM无响应出错这里就是等EEPROM写完这样读的信号EEPROM 才能响应。

//Send the EEPROM's internal address to write toI2C_SendData(I2C2, RAddr_H);//Test on EV8 and clear itwhile(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));发一个字节就要等待一个响应信号,发EEPROM地址也是一样。

基于STM32F10x-一看两看就懂的IIC教程

基于STM32F10x-一看两看就懂的IIC教程

废话不多说,下面简单介绍一下IIC:IIC(IIC,inter-Integrated circuit),两线式串行总线,用于MCU和外设间的通信。

又俗称I2C IIC只需两根线:时钟线SCL和数据线SDA。

以半双工方式实现外设和MCU之间数据传输,速度可达400kbps。

这里以芯片型号为STM32F103RCT6为例.我们在这里只是概括的讲,详细的内容,可以在稍微熟悉以后再去看STM32中文参考手册。

总线空闲状态包括:SDA :高电平SCL :高电平总线信号包括:SDA :串行数据线SCL :串行时钟起始位:SCL为高电平期间,SDA出现下降沿终止位:SCL为高电平期间,SDA出现上升沿IIC时钟频率:一般不高于400K数据传输:SDA的数据在SCL高电平期间被写入从机。

所以SDA的数据变化要发生在SCL 低电平期间。

应答:当IIC主机(不一定是发送端还是接受端)将8位数据或命令传出后,会将SDA信号设置为输入,等待从机应答(等待SDA由高电平拉为低电平)若从机正确应答,表明数据或者命令传输成功,否则传输失败,注意,应答信号是数据接收方发送给数据发送方的。

IIC器件地址:每一个IIC器件都有一个器件地址,有的器件地址在出厂时地址就设定好了,用户不可以更改。

有的器件例如EEPROM,前四个地址已经确定为1010,后三个地址是由硬件链接确定的,所以一个IIC总线最多能连8个EEPROM芯片。

多主从的系统结构以上为简单原理介绍,以下是具体代码实现:初始化:void IIC_Config(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = SDA_Pin | SCL_Pin;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(I2C_PORT, &GPIO_InitStructure);}void SDA_Input(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = SDA_Pin;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(I2C_PORT,&GPIO_InitStructure);}void SDA_Output(void){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = SDA_Pin;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(I2C_PORT,&GPIO_InitStructure);}SDA的输出读取配置:uint8_t SDA_ReadIn(){uint8_t bitstatus = 0x00;if ((I2C_PORT->IDR & SDA_Pin) != (uint32_t)Bit_RESET){bitstatus = (uint8_t)Bit_SET;}else{bitstatus = (uint8_t)Bit_RESET;}return bitstatus;}设置SDA SCL高低电平:void SDA_(u8 n){n != Low ? (I2C_PORT->BSRR = SDA_Pin): (I2C_PORT->BRR = SDA_Pin); }void SCL_(u8 n){n != Low ? (I2C_PORT->BSRR = SCL_Pin): (I2C_PORT->BRR = SCL_Pin); }I2C开始:void IIC_Start(void){SDA_H;delay;SCL_H;delay;SDA_L;delay;SCL_L;delay;}I2C停止:void IIC_Stop(void){SCL_L;delay;SDA_L;delay;SCL_H;delay;SDA_H;delay;}等待应答:unsigned char IIC_WaitAck(void){u8 ErrorTime = 5;SDA_Input();delay;SCL_H;delay;while((uint8_t)SDA_ReadIn()){ErrorTime--;delay;if(0 ==ErrorTime){SDA_Output();IIC_Stop();return FAILURE;}}SDA_Output();SCL_L;delay;return SUCCESS;}发送应答:void IIC_SendAck(void){SDA_L;delay;delay;SCL_H;delay;SCL_L;delay;}不产生应答:void IIC_SendNoAck(void){SDA_H;delay;delay;SCL_H;delay;SCL_L;delay;}发送字节:void IIC_SendByte(unsigned char byte){ unsigned char t = 8;for(;t>0;t--){SCL_L;delay;SDA_(byte & 0x80);delay;byte+=byte;delay;SCL_H;delay;}SCL_L;delay;}读取字节:unsigned char IIC_RecByte(void){unsigned char t = 8;unsigned char RevByte = 0;SDA_Input();for(;t>0;t--){RevByte+=RevByte;SCL_L;delay;delay;SCL_H;delay;RevByte|= SDA_ReadIn();}SCL_L;delay;SDA_Output();return RevByte;}C文件具体结构:#include "stm32f10x.h"#define I2C_PORT GPIOB#define SDA_Pin GPIO_Pin_7#define SCL_Pin GPIO_Pin_6#define FAILURE 0#define SUCCESS 1#define High 1#define Low 0#define delay {unsigned int i = 0 ; for(;i<500;++i);} #define SDA_H SDA_(High)#define SDA_L SDA_(Low)#define SCL_H SCL_(High)#define SCL_L SCL_(Low)void IIC_Config(void);void SDA_Input(void);void SDA_Output(void);void SDA_(u8 n);void SCL_(u8 n);void IIC_Start(void);void IIC_Stop(void);unsigned char IIC_WaitAck(void);void IIC_SendAck(void);void IIC_SendNoAck(void);void IIC_SendByte(unsigned char byte);unsigned char IIC_RecByte(void);。

野火STM32程序一览表

野火STM32程序一览表

野火STM32开发板程序一览表第一部分《零死角玩转stm32-初级篇》教程零死角玩转stm32-初级篇.pdf序号说明是否测试,技术支持1 ST库3.0.0源码已测试论坛讨论2 野火M3工程模板(3.0.0)已测试论坛讨论3 ST库3.5.0源码已测试论坛讨论4 野火M3工程模板(3.5.0)已测试论坛讨论5 野火M3-流水灯已测试论坛讨论6 野火M3-SysTick 已测试论坛讨论7 野火M3-KEY(polling)已测试论坛讨论8 野火M3-KEY(EXTI)已测试论坛讨论第二部分-《零死角玩转stm32-中级篇》教程零死角玩转stm32-中级篇.pdf序号说明是否测试技术支持1 野火M3-USART1(polling)已测试论坛讨论2 野火M3-USART1(interrupt)已测试论坛讨论3 野火M3-USART1(DMA)已测试论坛讨论4 野火M3-USART2(polling)已测试论坛讨论5 野火M3-Chip-ID 已测试论坛讨论6 野火M3-CRC 已测试论坛讨论7 野火M3-ADC(DMA)已测试论坛讨论8 野火M3-Temperature 已测试论坛讨论9 野火M3-TIM2 已测试论坛讨论10 野火M3-RTC 已测试论坛讨论11 野火M3-Calendar 已测试论坛讨论12 野火M3-IIC(EEPROM)已测试论坛讨论13 野火M3-SPI(W25X16 / W25Q16)已测试论坛讨论14 野火M3-PWM 已测试论坛讨论15 野火M3-CAN(Loopback)已测试论坛讨论16 野火M3-CAN(Mutual)已测试论坛讨论17 野火M3-USART2-485 已测试论坛讨论18 野火M3-温湿度(DTH11)已测试论坛讨论19 野火M3-超声波已测试论坛讨论20 野火M3-2.4G(NRF24L01+)已测试论坛讨论21 野火M3-重力感应(MMA7455)已测试论坛讨论第三部分-《零死角玩转stm32-高级篇》教程零死角玩转stm32-高级篇.pdf序号说明是否测试技术支持1 野火M3-SDIO(4bit + DMA、支持SDHC已测试论坛讨论卡)2 野火M3-FATFS(Vertion-009RC)已测试论坛讨论3 野火M3-3.2寸LCD显示(中、英、图片-已测试论坛讨论BMP格式)4 野火M3-3.2寸LCD触摸已测试论坛讨论5 野火M3-MP3已测试论坛讨论6 野火M3-计算器已测试论坛讨论7 野火M3-UsbDevice(模拟U盘)已测试论坛讨论8 野火M3-以太网(ENC28J60 + Lwip)已测试论坛讨论9 VGA-中、英、图片-BOM格式已测试论坛讨论10 野火M3-WIFI已测试论坛讨论11 野火M3-摄像头已测试论坛讨论12 野火M3-PWM Input Capture 没测试论坛讨论13 野火M3-ModBus 没测试论坛讨论第四部分-零死角玩转stm32-系统篇µCOS-II(V2.90)教程零死角玩转stm32-系统篇(uCOS).pdf序号说明是否测试技术支持1 野火M3-µCOS-II+LED(单任已测试论坛讨论务)2 野火M3-µCOS-II+LED(多任已测试论坛讨论务)3 野火M3-UCOS+计算器-2.4寸已测试论坛讨论LCD(不通信)4 野火M3-UCOS+计算器-2.4寸已测试论坛讨论LCD(队列)5 野火M3-µCOS-II+µCGUI (开机已测试论坛讨论例程-3.2寸LCD)飞鸟教程1嵌入式实时内核设计.pdf教程2 零死角玩转stm32-系统篇(飞鸟).pdf1 野火M3-飞鸟+LED(多任务)已测试论坛讨论RT-Thread教程1 野火M3-RTT+LED(多任务)已测试论坛讨论2 野火M3-RTT(finsh调试)已测试论坛讨论3 野火M3-RTT(线程同步)已测试论坛讨论4 野火M3-RTT(FS)已测试论坛讨论。

stm32射频EEPROM和读写芯片

stm32射频EEPROM和读写芯片

什么是M24LR16E的能量捕获功能?
当能量捕获功能处于工作状态, M24LR16E可以将 捕获的多余能量提供给其他器件
其他器件
多余能量
VOUT pin
M24LR16E
M24LR16E的VOUT 脚
代替
RF读写器 M24LR64的E0脚
M24LRxx 应用
M24LR16E电能输出功能演示
M24LR16E输出2.6~3.1V电压
LED由M24LБайду номын сангаас16E从射频场 中获取的能量供电
STM8L Discovery 开发板
电表和水表无线抄表应用
无需外部电 源的RF技术
高可靠性 EEPROM
超低功耗I² C 接口
32位密码保 护功能
能量捕获功能
M24LR64 电子货架标签(低成本方案)
ESL
Display(LCD) MCU Battery
适合应用于便携式和固定式RFID读写器的应用
CR95HF主要特性
13.56MHz多协议无线收发芯片 支持ISO15693、ISO14443 A/B和NFC ISO18092模拟前端 UART和SPI接口 不支持卡模拟和点对点通信功能 标准QFN32封装, 5x5mm Dual Interface EEPROM 3V工作电压 ISO15693 无内嵌加密算法
NFC enabled Consumer phone
针对需要从内部接口(I2C)和外部接口(RF) 对设备的参数、信息进行读或写的应用
双接口EEPROM – 如何工作?
基于无源RFID技术 仅仅在PCB板上多一个13.56MHz的感应天线
双接口EEPROM
双接口EEPROM的RF接口工作 时, 不需要从设备获取电能

STM32系统学习——I2C (读写EEPROM)

STM32系统学习——I2C (读写EEPROM)

STM32 系统学习——I2C (读写EEPROM)
I2C 通讯协议(Inter-Integrated Circuit)引脚少,硬件实现简单,可扩展性强,不需要USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

在计算机科学里,大部分复杂的问题都可以通过分层来简化。

如芯片被分为
内核层和片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。

对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协
议层。

物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物
理媒体的传输。

协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。

简单来说物理层规定我们用嘴巴还是用肢体来交流,
协议层则规定我们用中文还是英文来交流。

一、I2C 物理层
它的物理层有如下特点:
(1) 它是一个支持设备的总线。

“总线”指多个设备共用的信号线。

在一个I2C 通讯总线中,可连接多个I2C 通讯设备,支持多个通讯主机及多个通讯从机。

(2) 一个I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。

数据线即用来表示数据,时钟线用于数据收发同步。

(3) 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。

(4) 总线通过上拉电阻接到电源。

当I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。

零死角玩转stm32-中级篇5、IIC(EEPROM)

零死角玩转stm32-中级篇5、IIC(EEPROM)

0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。

M3的世界,与野火同行,乐意惬无边。

另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。

内容上会给你带来更多的惊喜。

是一本学习STM32必备的工具书。

敬请期待!5、IIC(EEPROM)5.1 实验描述及工程文件清单实验描述向EERPOM写入数据,再读取出来,进行校验,通过串口打印写入与读取出来的数据,并输出校验结果。

硬件连接PB6-I2C1_SCL,PB7-I2C1_SDA用到的库文件startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.cFWlib/stm32f10x_i2c.c用户编写的文件USER/main.cUSER/stm32f10x_it.cUSER/usart1.cUSER/i2c_ee.c野火STM32开发板 I2C-EEPROM硬件原理图:5.2 I2C简介I2C(芯片间)总线接口连接微控制器和串行I2C总线。

它提供多主机功能,控制所有I2C总线特定的时序、协议、仲裁和定时。

支持标准和快速两种模式,stm32的I2C可以使用DMA方式操作。

野火STM32开发板用的是STM32F103VET6。

它有2个I2C接口。

I/O口定义为PB6-I2C1_SCL,PB7-I2C1_SDA;PB10-I2C2_SCL,PB11-I2C2_SDA。

本实验使用I2C1,对应地连接到EERPOM(型号:AT24C02)的SCL和SDA 线。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。

M3的世界,与野火同行,乐意惬无边。

另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。

内容上会给你带来更多的惊喜。

是一本学习STM32必备的工具书。

敬请期待!5、IIC(EEPROM)5.1 实验描述及工程文件清单实验描述向EERPOM写入数据,再读取出来,进行校验,通过串口打印写入与读取出来的数据,并输出校验结果。

硬件连接PB6-I2C1_SCL,PB7-I2C1_SDA用到的库文件startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.cFWlib/stm32f10x_i2c.c用户编写的文件USER/main.cUSER/stm32f10x_it.cUSER/usart1.cUSER/i2c_ee.c野火STM32开发板 I2C-EEPROM硬件原理图:5.2 I2C简介I2C(芯片间)总线接口连接微控制器和串行I2C总线。

它提供多主机功能,控制所有I2C总线特定的时序、协议、仲裁和定时。

支持标准和快速两种模式,stm32的I2C可以使用DMA方式操作。

野火STM32开发板用的是STM32F103VET6。

它有2个I2C接口。

I/O口定义为PB6-I2C1_SCL,PB7-I2C1_SDA;PB10-I2C2_SCL,PB11-I2C2_SDA。

本实验使用I2C1,对应地连接到EERPOM(型号:AT24C02)的SCL和SDA 线。

实现I2C通讯,对EERPOM进行读写。

本实验采用主模式,分别用作主发送器和主接收器。

通过查询事件的方式来确保正常通讯。

5.3代码分析首先要添加用的库文件,在工程文件夹下Fwlib下我们需添加以下库文件:1.stm32f10x_gpio.c2.stm32f10x_rcc.c3.stm32f10x_usart.c4.stm32f10x_i2c.c还要在stm32f10x_conf.h中把相应的头文件添加进来:1./* Uncomment the line below to enable peripheral header file inclusion*/2./* #include "stm32f10x_adc.h" */3./* #include "stm32f10x_bkp.h" */4./* #include "stm32f10x_can.h" */5./* #include "stm32f10x_crc.h" */6./* #include "stm32f10x_dac.h" */7./* #include "stm32f10x_dbgmcu.h" */8./* #include "stm32f10x_dma.h" */9./* #include "stm32f10x_exti.h" */10./*#include "stm32f10x_flash.h"*/11./* #include "stm32f10x_fsmc.h" */12.#include "stm32f10x_gpio.h"13.#include "stm32f10x_i2c.h"14./* #include "stm32f10x_iwdg.h" */15./* #include "stm32f10x_pwr.h" */16.#include "stm32f10x_rcc.h"17./* #include "stm32f10x_rtc.h" */18./* #include "stm32f10x_sdio.h" */19./* #include "stm32f10x_spi.h" */20./* #include "stm32f10x_tim.h" */21.#include "stm32f10x_usart.h"22./* #include "stm32f10x_wwdg.h" */23./*#include "misc.h"*//* High level functions for NVIC and SysTick (add-on to CMSIS functions) */配置好所需的库文件之后,我们就从main函数开始分析:1./*2. * 函数名:main3. * 描述:主函数4. * 输入:无5. * 输出:无6. * 返回:无7. */8.int main(void)9.{10./* 配置系统时钟为 72M */11. SystemInit();;12.13./* 串口1初始化 */14. USART1_Config();15.16./* I2C 外设初(AT24C02)始化 */17. I2C_EE_Init();18.19. USART1_printf(USART1, "\r\n 这是一个I2C外设(AT24C02)读写测试例程 \r\n");20. USART1_printf(USART1, "\r\n ("__DATE__ " -" __TIME__ ") \r\n");21.22. I2C_Test();23.24.while (1)25. {26. }27.}系统库函数SystemInit();将系统时钟设置为72M, USART1_Config(); 配置串口,关于这两个函数的具体讲解可以参考前面的教程,这里不再详述。

/*1. * 函数名:I2C_EE_Init2. * 描述:I2C 外设(EEPROM)初始化3. * 输入:无4. * 输出:无5. * 调用:外部调用6. */7.void I2C_EE_Init(void)8.{9.10. I2C_GPIO_Config();11.12. I2C_Mode_Configu();13.14./* 根据头文件i2c_ee.h中的定义来选择EEPROM要写入的地址 */15.#ifdef EEPROM_Block0_ADDRESS16./* 选择 EEPROM Block0 来写入 */17. EEPROM_ADDRESS = EEPROM_Block0_ADDRESS;18.#endif19.20.#ifdef EEPROM_Block1_ADDRESS21./* 选择 EEPROM Block1 来写入 */22. EEPROM_ADDRESS = EEPROM_Block1_ADDRESS;23.#endif24.25.#ifdef EEPROM_Block2_ADDRESS26./* 选择 EEPROM Block2 来写入 */27. EEPROM_ADDRESS = EEPROM_Block2_ADDRESS;28.#endif29.30.#ifdef EEPROM_Block3_ADDRESS31./* 选择 EEPROM Block3 来写入 */32. EEPROM_ADDRESS = EEPROM_Block3_ADDRESS;33.#endif }I2C_EE_Init();是用户编写的函数,其中调用了I2C_GPIO_Config();配置好I2C所用的I/O端口,调用I2C_Mode_Configu();设置I2C的工作模式。

并使能相关外设的时钟。

其中的条件编译确定了EERPOM的器件地址,按我们的硬件设置方式,地址为0xA0;1./*2. * 函数名:I2C_EE_Test3. * 描述:I2C(AT24C02)读写测试。

4. * 输入:无5. * 输出:无6. * 返回:无7. */8.void I2C_Test(void)9.{10. u16 i;11.12. printf("写入的数据\n\r");13.14.for ( i=0; i<=255; i++ ) //填充缓冲15. {16. I2c_Buf_Write[i] = i;17.18. printf("0x%02X ", I2c_Buf_Write[i]);19.if(i%16 == 15)20. printf("\n\r");21. }22.23.//将I2c_Buf_Write中顺序递增的数据写入EERPOM中24. I2C_EE_BufferWrite( I2c_Buf_Write, EEP_Firstpage, 256);25.26. printf("\n\r读出的数据\n\r");27.//将EEPROM读出数据顺序保持到I2c_Buf_Read中28. I2C_EE_BufferRead(I2c_Buf_Read, EEP_Firstpage, 256);29.30.//将I2c_Buf_Read中的数据通过串口打印31.for (i=0; i<256; i++)32. {33.if(I2c_Buf_Read[i] != I2c_Buf_Write[i])34. {35. printf("0x%02X ", I2c_Buf_Read[i]);36. printf("错误:I2C EEPROM写入与读出的数据不一致\n\r");37.return;38. }39. printf("0x%02X ", I2c_Buf_Read[i]);41. printf("\n\r");42.43. }44. printf("I2C(AT24C02)读写测试成功\n\r");45.}I2C_Test(void)是这个例程中最主要的部分,把0~255按顺序填入缓冲区并通过串口打印到端口,接着把缓冲区的数据通过调用I2C_EE_BufferWrite()函数写入EEPROM。

相关文档
最新文档