基于STM32的IIC总线设计毕业论文.doc

上传人:来看看 文档编号:3921597 上传时间:2019-10-10 格式:DOC 页数:12 大小:127.50KB
返回 下载 相关 举报
基于STM32的IIC总线设计毕业论文.doc_第1页
第1页 / 共12页
基于STM32的IIC总线设计毕业论文.doc_第2页
第2页 / 共12页
基于STM32的IIC总线设计毕业论文.doc_第3页
第3页 / 共12页
基于STM32的IIC总线设计毕业论文.doc_第4页
第4页 / 共12页
基于STM32的IIC总线设计毕业论文.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《基于STM32的IIC总线设计毕业论文.doc》由会员分享,可在线阅读,更多相关《基于STM32的IIC总线设计毕业论文.doc(12页珍藏版)》请在三一文库上搜索。

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 #include 24cxx.h #include myiic.hconst u8 TEXT_Buffer=MiniSTM32 IIC TEST;#d

9、efine 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

10、_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

11、(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,

12、(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,datat

13、emp);/显示读到的字符串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

14、=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_InitStruc

15、ture.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;/顺序进行规则转

16、换的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_SoftwareStartCo

17、nvCmd(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 );/等待转换结束

18、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

19、);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;del

20、ay_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();

21、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

22、_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 :开始读

23、出的地址 /返回值 :数据/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是否正常/这里用了24XX的最后一个地址(255)来存储标志字./如果用其他24C系列,这个地址要修改/返回1:检测失败/返回0:检测成功u8 AT24CXX_Check(void)u8 temp;temp=AT24CXX_ReadOn

24、eByte(255);/避免每次开机都写AT24CXX if(temp=0X55)return 0; else/排除第一次初始化的情况AT24CXX_WriteOneByte(255,0X55); temp=AT24CXX_ReadOneByte(255); if(temp=0X55)return 0;return 1; /在AT24CXX里面的指定地址开始读出指定个数的数据/ReadAddr :开始读出的地址 对24c02为0255/pBuffer :数据数组首地址/NumToRead:要读出数据的个数void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u1

25、6 NumToRead)while(NumToRead)*pBuffer+=AT24CXX_ReadOneByte(ReadAddr+);NumToRead-; /在AT24CXX里面的指定地址开始写入指定个数的数据/WriteAddr :开始写入的地址 对24c02为0255/pBuffer :数据数组首地址/NumToWrite:要写入数据的个数void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)while(NumToWrite-)AT24CXX_WriteOneByte(WriteAddr,*pBuffer);WriteAddr+;pBuffer+; 批阅教师意见经综合评价,论文得分为:批阅教师签名:批阅日期:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1