零死角玩转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写⼊、读取数据步骤
写⼊⼀个字节:
第⼀步:使⽤库函数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程序详细解释

#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 问题总结

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原理及应⽤详细步骤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),⼀般表⽰接收器接收该字节没有成功。

  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。

相关文档
最新文档