




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于stm32的iic总线设计摘要: 在需要远距离传输数据,而且布线不方便的情况下使用iic总线能解决这个问题。本文通过iic总线将从机ad采样的数据存储到eeprom芯片里面,同时,通过iic总线将存储的数据给其他单片机使用,并用stm32开发板进行了实验仿真。关键词: iic总线 eeprom arm单片机1 引言随着大规模集成电路技术的发展,把cpu和一个单独工作系统所必需的rom、ram、i/o端口、a/d、d/a等外围电路集成在一个单片内而制成的单片机或微控制器愈来愈方便。目前,世界上许多公司生产单片机,品种很多。其中包括各种字长的cpu,各种容量的rom、ram以及功能各异的i/o接口电路等等,但是,单片机的品种规格仍然有限,所以只能选用某种单片机来进行扩展。扩展的方法有两种:一种是并行总线,另一种是串行总线1。由于串行总线的连线少,结构简单,往往不用专门的母板和插座而直接用导线连接各个设备。因此,采用串行线可大大简化系统的硬件设计。philips公司早在十几年前就推出了i2c串行总线,利用该总线可实现多主机系统所需的裁决和高低速设备同步等功能。iic 即inter-integrated circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ics) ,iic是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源2。这种方式简化了信号传输总线接口。ad采样ad采样2 方案设计 eeprom arm 单片机 arm 单片机 arm 单片机 iic总线图一 方案原理图通过ad采样将我们收集到的数据输入给单片机,经过单片机处理后经iic总线把数据存储到芯片里面,方便给其他单片机使用。由于使用的是iic总线,只需要两根线,大大节约了成本,而且方便布线。3 工作原理物理结构上,iic系统由一条串行数据线sda和一条串行时钟线scl组成。主机按一定的通信协议向从机寻址和进行信息传输。在数据传输时,由主机初始化一次数据传输,主机使数据在sda线上传输的同时还通过scl线传输时钟。信息传输的对象和方向以及信息传输的开始和终止均由主机决定。每个器件都有一个唯一的地址,而且可以是单接收的器件或者可以接收也可以发送的器件。发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。一般情况下,一个标准的iic通信由四部分组成:开始信号、从机地址传输、数据传输、停止信号。由主机发送一个开始信号,启动一次iic通信;在主机对从机寻址后,再在总线上传输数据。iic总线上传送的每一个字节均为8位,首先发送的数据位为最高位,每传送一个字节后都必须跟随一个应答位,每次通信的数据字节数是没有限制的;在全部数据传送结束后,由主机发送停止信号,结束通信。4 硬件设计需要用到的硬件有stm32芯片,本次设计仿真所用的是stm32f103rct6,同时还需要eeprom存储芯片,选择的是24c02这款芯片,为了显示是否发送成功增加量lcd显示屏,仿真平台为mini stm32开发版。其中,硬件连接图见图2。图二 stm32与24c02连接图a0、a1、a2为器件的地址选择,gnd接地,vcc工作电压-1.8v-6v,wp为写保护,5、6引脚即iic总线的时钟线和数据线4。5程序设计5.1 adc初始化图三 adc初始化流程图 adc初始化流程图如图三所示。本文采用了定时采样,为了方便设置为10微秒,由于stm32的采样时间没有刚好等于10微秒的,所以用了71.5的采样周期加上固定的12.5个周期,选用72m6分频得到采样时间为7微秒,再延时3微秒实现要求值。5.2存储与读取数据首先,iic工作前需要驱动代码。其中包括iic初始化、iic开始、iic结束、ack、iic读写等功能。主函数工作之前需要初始化的有延时、串口、iic等,通过按键来切换选择读取还是写入,其具体代码见附录。读取和存储数据流程图见图四:准备初始化监测总线等待地址信号 n y产生应答 接受数据存储数据结束信号结束图四 读写和存储数据流程图6 总结特点:1) iic总线只要求两条总线线路,一条串行数据线 sda,一条串行时钟线 scl。布线方便 2) 每个连接到总线的器件都可以通过设定唯一的地址进行数据交换。 3)传输距离远,适合于远距离布线 。缺点:1) 从机的数量收到限制。2) 总线上主机过多会导致数据冲突效率不高。改进:1) 如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏。2)可以和智能仪表相连构建现场iic总线系统。3)将单纯的单片机改变成智能单片机实现智能化。4)多种总线接口联合在一起再和英特网相连实现工业物联网系统5。7参考文献1陈光建,贾金玲,基于单片机12c总线系统设计j.仪器仪表学报,2006,27(6):2466-24722何立民.iic总线应用系统设计m.北京:北京航空航天大学出版社,19953周立功,张华.深入浅出arm m.北京:北京航空航天大学出版社.2006:1-161.4 张洋,原子教你玩stm32m. 北京航空航天大学出版社,2013.45雷林,基于internet和现场总线的测控系统研究j.仪器仪表学报,2012,23(z2):690-6918附录程序主函数#include led.h#include delay.h#include sys.h#include usart.h#include lcd.h#include key.h #include 24cxx.h #include myiic.hconst u8 text_buffer=ministm32 iic test;#define size sizeof(text_buffer) int main(void) u8 key;u16 i=0;u8 datatempsize;nvic_configuration();delay_init(); /延时函数初始化 uart_init(9600); /串口初始化为9600led_init(); /初始化与led连接的硬件接口 lcd_init();key_init();/按键初始化 at24cxx_init();/iic初始化 point_color=red;/设置字体为红色 lcd_showstring(60,50,200,16,16,mini stm32);lcd_showstring(60,70,200,16,16,iic test);lcd_showstring(60,90,200,16,16,atomalientek);lcd_showstring(60,110,200,16,16,2014/3/9);lcd_showstring(60,130,200,16,16,wk_up:write key0:read);/显示提示信息 while(at24cxx_check()/检测不到24c02lcd_showstring(60,150,200,16,16,24c02 check failed!);delay_ms(500);lcd_showstring(60,150,200,16,16,please check! );delay_ms(500);led0=!led0;/ds0闪烁lcd_showstring(60,150,200,16,16,24c02 ready!); point_color=blue;/设置字体为蓝色 while(1)key=key_scan(0);if(key=wkup_pres)/wk_up 按下,写入24c02lcd_fill(0,170,239,319,white);/清除半屏 lcd_showstring(60,170,200,16,16,start write 24c02.);at24cxx_write(0,(u8*)text_buffer,size);lcd_showstring(60,170,200,16,16,24c02 write finished!);/提示传送完成if(key=key0_pres)/key0 按下,读取字符串并显示 lcd_showstring(60,170,200,16,16,start read 24c02. );at24cxx_read(0,datatemp,size);lcd_showstring(60,170,200,16,16,the data readed is: );/提示传送完成lcd_showstring(60,190,200,16,16,datatemp);/显示读到的字符串i+;delay_ms(10);if(i=20)led0=!led0;/提示系统正在运行i=0; adc初始化代码void adc_init(void) adc_inittypedef adc_initstructure; gpio_inittypedef gpio_initstructure;rcc_apb2periphclockcmd(rcc_apb2periph_gpioa |rcc_apb2periph_adc1, enable ); /使能adc1通道时钟rcc_adcclkconfig(rcc_pclk2_div6); /设置adc分频因子6 72m/6=12,adc最大时间不能超过14m/pa1 作为模拟通道输入引脚 gpio_initstructure.gpio_pin = gpio_pin_1;gpio_initstructure.gpio_mode = gpio_mode_ain;/模拟输入引脚gpio_init(gpioa, &gpio_initstructure);adc_deinit(adc1); /复位adc1,将外设 adc1 的全部寄存器重设为缺省值adc_initstructure.adc_mode = adc_mode_independent;/adc工作模式:adc1和adc2工作在独立模式adc_initstructure.adc_scanconvmode = disable;/模数转换工作在单通道模式adc_initstructure.adc_continuousconvmode = disable;/模数转换工作在单次转换模式adc_initstructure.adc_externaltrigconv = adc_externaltrigconv_none;/由软件而不是外部触发启动adc_initstructure.adc_dataalign = adc_dataalign_right;/adc数据右对齐adc_initstructure.adc_nbrofchannel = 1;/顺序进行规则转换的adc通道的数目adc_init(adc1, &adc_initstructure);/根据adc_initstruct中指定的参数初始化外设adcx的寄存器 adc_cmd(adc1, enable);/使能指定的adc1adc_resetcalibration(adc1);/使能复位校准 while(adc_getresetcalibrationstatus(adc1);/等待复位校准结束adc_startcalibration(adc1); /开启ad校准while(adc_getcalibrationstatus(adc1); /等待校准结束/adc_softwarestartconvcmd(adc1, enable);/使能指定的adc1的软件转换启动功能 /获得adc值/ch:通道值 03u16 get_adc(u8 ch) /设置指定adc的规则组通道,一个序列,采样时间adc_regularchannelconfig(adc1, ch, 1, adc_sampletime_71cycles5 );/adc1,adc通道,采样时间为71.5周期 adc_softwarestartconvcmd(adc1, enable);/使能指定的adc1的软件转换启动功能while(!adc_getflagstatus(adc1, adc_flag_eoc );/等待转换结束delay_us(3);return adc_getconversionvalue(adc1);/返回最近一次adc1规则组的转换结果iic子程序#include myiic.h#include delay.h/初始化iicvoid iic_init(void) gpio_inittypedef gpio_initstructure;/rcc-apb2enr|=1250)iic_stop();return 1;iic_scl=0;/时钟输出0 return 0; /产生ack应答void iic_ack(void)iic_scl=0;sda_out();iic_sda=0;delay_us(2);iic_scl=1;delay_us(2);iic_scl=0;/不产生ack应答 void iic_nack(void)iic_scl=0;sda_out();iic_sda=1;delay_us(2);iic_scl=1;delay_us(2);iic_scl=0; /iic发送一个字节/返回从机有无应答/1,有应答/0,无应答 void iic_send_byte(u8 txd) u8 t; sda_out(); iic_scl=0;/拉低时钟开始数据传输 for(t=0;t7; txd=1; delay_us(2); /对tea5767这三个延时都是必须的iic_scl=1;delay_us(2); iic_scl=0;delay_us(2); /读1个字节,ack=1时,发送ack,ack=0,发送nack u8 iic_read_byte(unsigned char ack)unsigned char i,receive=0;sda_in();/sda设置为输入 for(i=0;i8;i+ ) iic_scl=0; delay_us(2);iic_scl=1; receiveat24c16)iic_send_byte(0xa0); /发送写命令iic_wait_ack();iic_send_byte(readaddr8);/发送高地址iic_wait_ack(); else iic_send_byte(0xa0+(readaddr/256)at24c16)iic_send_byte(0xa0); /发送写命令iic_wait_ack();iic_send_byte(writeaddr8);/发送高地址 elseiic_send_byte(0xa0+(writeaddr/256)1); /发送器件地址0xa0,写数据 iic_wait_ack(); iic_send_byte(writeaddr%256); /发送低地址iic_wait_ack(); iic_send_byte(datatowrite); /发送字节 iic_wait_ack(); iic_stop();/产生一个停止条件 delay_ms(10); /在at24cxx里面的指定地址开始写入长度为len的数据/该函数用于写入16bit或者32bit的数据./writeaddr :开始写入的地址 /datatowrite:数据数组首地址/len :要写入数据的长度2,4void at24cxx_writelenbyte(u16 writeaddr,u32 datatowrite,u8 len) u8 t;for(t=0;t(8*t)&0xff); /在at24cxx里面的指定地址开始读出长度为len的数据/该函数用于读出16bit或者32bit的数据./readaddr :开始读出的地址 /返回值 :数据/len :要读出数据的长度2,4u32 at24cxx_readlenbyte(u16 readaddr,u8 len) u8 t;u32 temp=0;for(t=0;tlen;t+)temp=8;temp+=at24cxx_readonebyte(readaddr+len-t-1); return temp; /检查at24cxx是否正常/这里用了2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年英语专业八级考试阅读理解长篇阅读押题试卷
- 王晨辉律师课件
- 民法典婚姻法课件提问
- 2022年学法用法向未来12月4日全国法制宣传日暨国家宪法日宣讲
- 2025年创业梦想孵化与职业成长辅导服务合同模板
- 国安法考试试题及答案
- 针对2025年矿山开采项目的风险评估与社区风险评估指标体系优化报告
- 毛线编织上针课件
- 车间新员工安全知识培训课件
- xx县政府信息主动公开制度
- 小儿上呼吸道感染
- 2025年CCAA国家注册审核员考试(产品认证基础)历年参考题库含答案详解(5卷)
- 2025-2030中国骨科手术导航机器人医生培训体系与手术量增长关联报告
- 2025年秋季小学四年级上册语文教学计划及教学进度表
- 北京市西城区2024-2025学年七年级下学期期末道德与法治试题(解析版)
- 苏州工业园区外国语学校语文新初一均衡分班试卷
- 《智能建造概论》高职完整全套教学课件
- 2025-2026小学学年度第一学期教学工作安排表:启智育心绘蓝图筑梦前行谱新篇
- 妇科常规手术器械处理流程
- 危险性较大工程安全监理制度
- 二手农业机械转让合同
评论
0/150
提交评论