




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于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
2、接口电路等等,但是,单片机的品种规格仍然有限,所以只能选用某种单片机来进行扩展。扩展的方法有两种:一种是并行总线,另一种是串行总线1。由于串行总线的连线少,结构简单,往往不用专门的母板和插座而直接用导线连接各个设备。因此,采用串行线可大大简化系统的硬件设计。PHILIPS公司早在十几年前就推出了I2C串行总线,利用该总线可实现多主机系统所需的裁决和高低速设备同步等功能。IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线
3、结构下,同时每个芯片都可以作为实时数据传输的控制源2。这种方式简化了信号传输总线接口。AD采样AD采样2 方案设计 EEPROM ARM 单片机 ARM 单片机 ARM 单片机 IIC总线图一 方案原理图通过AD采样将我们收集到的数据输入给单片机,经过单片机处理后经IIC总线把数据存储到芯片里面,方便给其他单片机使用。由于使用的是IIC总线,只需要两根线,大大节约了成本,而且方便布线。3 工作原理物理结构上,IIC系统由一条串行数据线SDA和一条串行时钟线SCL组成。主机按一定的通信协议向从机寻址和进行信息传输。在数据传输时,由主机初始化一次数据传输,主机使数据在SDA线上传输的同时还通过SC
4、L线传输时钟。信息传输的对象和方向以及信息传输的开始和终止均由主机决定。每个器件都有一个唯一的地址,而且可以是单接收的器件或者可以接收也可以发送的器件。发送器或接收器可以在主模式或从模式下操作,这取决于芯片是否必须启动数据的传输还是仅仅被寻址。一般情况下,一个标准的IIC通信由四部分组成:开始信号、从机地址传输、数据传输、停止信号。由主机发送一个开始信号,启动一次IIC通信;在主机对从机寻址后,再在总线上传输数据。IIC总线上传送的每一个字节均为8位,首先发送的数据位为最高位,每传送一个字节后都必须跟随一个应答位,每次通信的数据字节数是没有限制的;在全部数据传送结束后,由主机发送停止信号,结束
5、通信。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微
6、秒的,所以用了71.5的采样周期加上固定的12.5个周期,选用72M6分频得到采样时间为7微秒,再延时3微秒实现要求值。5.2存储与读取数据首先,IIC工作前需要驱动代码。其中包括IIC初始化、IIC开始、IIC结束、ACK、IIC读写等功能。主函数工作之前需要初始化的有延时、串口、IIC等,通过按键来切换选择读取还是写入,其具体代码见附录。读取和存储数据流程图见图四:准备初始化监测总线等待地址信号 N Y产生应答 接受数据存储数据结束信号结束图四 读写和存储数据流程图6 总结特点:1) IIC总线只要求两条总线线路,一条串行数据线 SDA,一条串行时钟线 SCL。布线方便 2) 每个连接到总
7、线的器件都可以通过设定唯一的地址进行数据交换。 3)传输距离远,适合于远距离布线 。缺点:1) 从机的数量收到限制。2) 总线上主机过多会导致数据冲突效率不高。改进:1) 如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏。2)可以和智能仪表相连构建现场IIC总线系统。3)将单纯的单片机改变成智能单片机实现智能化。4)多种总线接口联合在一起再和英特网相连实现工业物联网系统5。7参考文献1陈光建,贾金玲,基于单片机12C总线系统设计J.仪器仪表学报,2006,27(6):2466-24722何立民.IIC总线应用系统设计M.北京:北京航空航天大学出版社,19953周立功,张
8、华.深入浅出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" #in
9、clude "24cxx.h" #include "myiic.h"const 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_I
10、nit();/按键初始化 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,13
11、0,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
12、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!&qu
13、ot;);/提示传送完成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;
14、/提示系统正在运行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_InitStruct
15、ure.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;/模数转换工作在单通道模式
16、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_InitStructu
17、re);/根据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的软件转换启动功能 /
18、获得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
19、(ADC1);/返回最近一次ADC1规则组的转换结果IIC子程序#include "myiic.h"#include "delay.h"/初始化IICvoid IIC_Init(void) GPIO_InitTypeDef GPIO_InitStructure;/RCC->APB2ENR|=1<<4;/先使能外设IO PORTC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_P
20、in_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; /推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure); IIC_SCL=1;IIC_SDA=1;/产生IIC起始信号void IIC_Start(void)SDA_OUT(); /sda线输出IIC_SDA=1; IIC_SCL=1;delay_us(4); IIC_SDA=0;/START:when CLK is high,DATA change
21、 form high to low delay_us(4);IIC_SCL=0;/钳住I2C总线,准备发送或接收数据 /产生IIC停止信号void IIC_Stop(void)SDA_OUT();/sda线输出IIC_SCL=0;IIC_SDA=0;/STOP:when CLK is high DATA change form low to high delay_us(4);IIC_SCL=1; IIC_SDA=1;/发送I2C总线结束信号delay_us(4); /等待应答信号到来/返回值:1,接收应答失败/ 0,接收应答成功u8 IIC_Wait_Ack(void)u8 ucErrTime
22、=0;SDA_IN(); /SDA设置为输入 IIC_SDA=1;delay_us(1); IIC_SCL=1;delay_us(1); while(READ_SDA)ucErrTime+;if(ucErrTime>250)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
23、;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;t<8;t+) IIC_SDA=(txd&0x80)>>7; txd<<=1; delay_us(2); /对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2); IIC_SCL=0;dela
24、y_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;i<8;i+ ) IIC_SCL=0; delay_us(2);IIC_SCL=1; receive<<=1; if(READ_SDA)receive+; delay_us(1); if (!ack) IIC_NAck();/发送nACK else IIC_Ack(); /发送ACK return receive;24C
25、02子程序#include "24cxx.h" #include "delay.h"/初始化IIC接口void AT24CXX_Init(void)IIC_Init();/在AT24CXX指定地址读出一个数据/ReadAddr:开始读数的地址 /返回值 :读到的数据u8 AT24CXX_ReadOneByte(u16 ReadAddr) u8 temp=0; IIC_Start(); if(EE_TYPE>AT24C16)IIC_Send_Byte(0XA0); /发送写命令IIC_Wait_Ack();IIC_Send_Byte(ReadAddr
26、>>8);/发送高地址IIC_Wait_Ack(); else IIC_Send_Byte(0XA0+(ReadAddr/256)<<1); /发送器件地址0XA0,写数据 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;/在AT24CXX指定地址写入一个数据/
27、WriteAddr :写入数据的目的地址 /DataToWrite:要写入的数据void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite) IIC_Start(); if(EE_TYPE>AT24C16)IIC_Send_Byte(0XA0); /发送写命令IIC_Wait_Ack();IIC_Send_Byte(WriteAddr>>8);/发送高地址 elseIIC_Send_Byte(0XA0+(WriteAddr/256)<<1); /发送器件地址0XA0,写数据 IIC_Wait_Ack(); IIC_
28、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<Len;t+)AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t)&0xff); /在AT24CXX里面的指定地址开始读出长度为Len的数据/该函数用于读出16bit或者32bit的数据./ReadAddr :开始读出的地址 /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 本溪市明山区2024-2025学年小升初复习数学模拟试卷含解析
- 云南旅游职业学院《混凝土和砌体结构设计》2023-2024学年第二学期期末试卷
- 广西中远职业学院《形体训练与健美》2023-2024学年第一学期期末试卷
- 宁波财经学院《趣味逻辑学与人生智慧》2023-2024学年第二学期期末试卷
- 兴义民族师范学院《数字系统设计》2023-2024学年第二学期期末试卷
- 渤海理工职业学院《外国电影史》2023-2024学年第二学期期末试卷
- 柱上式无功补偿装置项目风险评估报告
- 广州科技贸易职业学院《心理学核心理论专题研究》2023-2024学年第一学期期末试卷
- 贵州体育职业学院《童装结构与工艺设计》2023-2024学年第二学期期末试卷
- 右江民族医学院《英语学术文献阅读》2023-2024学年第二学期期末试卷
- 2024年人教版八年级生物下册期末考试卷(附答案)
- 1.设备设施运行、检修、维护、保养管理制度
- 二位数乘二位数600道
- 2024年湖南省高考物理试卷真题(含答案解析)
- 初级制图员职业鉴定考试题及答案
- 大型机械设备进出场及安拆施工专项方案
- 创维电视机E710U系列电子说明书
- 《山谷回音真好听》名师课件(简谱)
- 医院抗菌药物临时采购使用申请表
- 高考英语核心词汇1000个
- 校园海绵城市设计方案
评论
0/150
提交评论