基于STM32的IIC總線設(shè)計_第1頁
基于STM32的IIC總線設(shè)計_第2頁
基于STM32的IIC總線設(shè)計_第3頁
基于STM32的IIC總線設(shè)計_第4頁
基于STM32的IIC總線設(shè)計_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、基于STM32的IIC總線設(shè)計摘要: 在需要遠距離傳輸數(shù)據(jù),而且布線不方便的情況下使用IIC總線能解決這個問題。本文通過IIC總線將從機AD采樣的數(shù)據(jù)存儲到EEPROM芯片里面,同時,通過IIC總線將存儲的數(shù)據(jù)給其他單片機使用,并用STM32開發(fā)板進行了實驗仿真。關(guān)鍵詞: IIC總線 EEPROM ARM單片機1 引言隨著大規(guī)模集成電路技術(shù)的發(fā)展,把CPU和一個單獨工作系統(tǒng)所必需的ROM、RAM、I/O端口、A/D、D/A等外圍電路集成在一個單片內(nèi)而制成的單片機或微控制器愈來愈方便。目前,世界上許多公司生產(chǎn)單片機,品種很多。其中包括各種字長的CPU,各種容量的ROM、RAM以及功能各異的I/O

2、接口電路等等,但是,單片機的品種規(guī)格仍然有限,所以只能選用某種單片機來進行擴展。擴展的方法有兩種:一種是并行總線,另一種是串行總線1。由于串行總線的連線少,結(jié)構(gòu)簡單,往往不用專門的母板和插座而直接用導(dǎo)線連接各個設(shè)備。因此,采用串行線可大大簡化系統(tǒng)的硬件設(shè)計。PHILIPS公司早在十幾年前就推出了I2C串行總線,利用該總線可實現(xiàn)多主機系統(tǒng)所需的裁決和高低速設(shè)備同步等功能。IIC 即Inter-Integrated Circuit(集成電路總線),這種總線類型是由飛利浦半導(dǎo)體公司在八十年代初設(shè)計出來的,主要是用來連接整體電路(ICS) ,IIC是一種多向控制總線,也就是說多個芯片可以連接到同一總線

3、結(jié)構(gòu)下,同時每個芯片都可以作為實時數(shù)據(jù)傳輸?shù)目刂圃?。這種方式簡化了信號傳輸總線接口。AD采樣AD采樣2 方案設(shè)計 EEPROM ARM 單片機 ARM 單片機 ARM 單片機 IIC總線圖一 方案原理圖通過AD采樣將我們收集到的數(shù)據(jù)輸入給單片機,經(jīng)過單片機處理后經(jīng)IIC總線把數(shù)據(jù)存儲到芯片里面,方便給其他單片機使用。由于使用的是IIC總線,只需要兩根線,大大節(jié)約了成本,而且方便布線。3 工作原理物理結(jié)構(gòu)上,IIC系統(tǒng)由一條串行數(shù)據(jù)線SDA和一條串行時鐘線SCL組成。主機按一定的通信協(xié)議向從機尋址和進行信息傳輸。在數(shù)據(jù)傳輸時,由主機初始化一次數(shù)據(jù)傳輸,主機使數(shù)據(jù)在SDA線上傳輸?shù)耐瑫r還通過SC

4、L線傳輸時鐘。信息傳輸?shù)膶ο蠛头较蛞约靶畔鬏數(shù)拈_始和終止均由主機決定。每個器件都有一個唯一的地址,而且可以是單接收的器件或者可以接收也可以發(fā)送的器件。發(fā)送器或接收器可以在主模式或從模式下操作,這取決于芯片是否必須啟動數(shù)據(jù)的傳輸還是僅僅被尋址。一般情況下,一個標(biāo)準(zhǔn)的IIC通信由四部分組成:開始信號、從機地址傳輸、數(shù)據(jù)傳輸、停止信號。由主機發(fā)送一個開始信號,啟動一次IIC通信;在主機對從機尋址后,再在總線上傳輸數(shù)據(jù)。IIC總線上傳送的每一個字節(jié)均為8位,首先發(fā)送的數(shù)據(jù)位為最高位,每傳送一個字節(jié)后都必須跟隨一個應(yīng)答位,每次通信的數(shù)據(jù)字節(jié)數(shù)是沒有限制的;在全部數(shù)據(jù)傳送結(jié)束后,由主機發(fā)送停止信號,結(jié)束

5、通信。4 硬件設(shè)計需要用到的硬件有STM32芯片,本次設(shè)計仿真所用的是STM32F103RCT6,同時還需要EEPROM存儲芯片,選擇的是24C02這款芯片,為了顯示是否發(fā)送成功增加量LCD顯示屏,仿真平臺為mini STM32開發(fā)版。其中,硬件連接圖見圖2。圖二 STM32與24C02連接圖A0、A1、A2為器件的地址選擇,GND接地,VCC工作電壓-1.8V-6V,WP為寫保護,5、6引腳即IIC總線的時鐘線和數(shù)據(jù)線4。5程序設(shè)計5.1 ADC初始化圖三 ADC初始化流程圖 ADC初始化流程圖如圖三所示。本文采用了定時采樣,為了方便設(shè)置為10微秒,由于stm32的采樣時間沒有剛好等于10微

6、秒的,所以用了71.5的采樣周期加上固定的12.5個周期,選用72M6分頻得到采樣時間為7微秒,再延時3微秒實現(xiàn)要求值。5.2存儲與讀取數(shù)據(jù)首先,IIC工作前需要驅(qū)動代碼。其中包括IIC初始化、IIC開始、IIC結(jié)束、ACK、IIC讀寫等功能。主函數(shù)工作之前需要初始化的有延時、串口、IIC等,通過按鍵來切換選擇讀取還是寫入,其具體代碼見附錄。讀取和存儲數(shù)據(jù)流程圖見圖四:準(zhǔn)備初始化監(jiān)測總線等待地址信號 N Y產(chǎn)生應(yīng)答 接受數(shù)據(jù)存儲數(shù)據(jù)結(jié)束信號結(jié)束圖四 讀寫和存儲數(shù)據(jù)流程圖6 總結(jié)特點:1) IIC總線只要求兩條總線線路,一條串行數(shù)據(jù)線 SDA,一條串行時鐘線 SCL。布線方便 2) 每個連接到總

7、線的器件都可以通過設(shè)定唯一的地址進行數(shù)據(jù)交換。 3)傳輸距離遠,適合于遠距離布線 。缺點:1) 從機的數(shù)量收到限制。2) 總線上主機過多會導(dǎo)致數(shù)據(jù)沖突效率不高。改進:1) 如果兩個或更多主機同時初始化數(shù)據(jù)傳輸可以通過沖突檢測和仲裁防止數(shù)據(jù)被破壞。2)可以和智能儀表相連構(gòu)建現(xiàn)場IIC總線系統(tǒng)。3)將單純的單片機改變成智能單片機實現(xiàn)智能化。4)多種總線接口聯(lián)合在一起再和英特網(wǎng)相連實現(xiàn)工業(yè)物聯(lián)網(wǎng)系統(tǒng)5。7參考文獻1陳光建,賈金玲,基于單片機12C總線系統(tǒng)設(shè)計J.儀器儀表學(xué)報,2006,27(6):2466-24722何立民.IIC總線應(yīng)用系統(tǒng)設(shè)計M.北京:北京航空航天大學(xué)出版社,19953周立功,張

8、華.深入淺出ARM M.北京:北京航空航天大學(xué)出版社.2006:1-161.4 張洋,原子教你玩STM32M. 北京航空航天大學(xué)出版社,2013.45雷林,基于internet和現(xiàn)場總線的測控系統(tǒng)研究J.儀器儀表學(xué)報,2012,23(z2):690-6918附錄程序主函數(shù)#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(); /延時函數(shù)初始化 uart_init(9600); /串口初始化為9600LED_Init(); /初始化與LED連接的硬件接口 LCD_Init();KEY_Init();/按鍵初始化 AT24CXX_Init();/IIC初始化 POINT_COLOR=RED;/設(shè)置字體為紅色 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;/設(shè)置字體為藍色 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;/提示系統(tǒng)正在運行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); /設(shè)置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); /復(fù)位ADC1,將外設(shè) ADC1 的全部寄存器重設(shè)為缺省值A(chǔ)DC_InitStructure.ADC_Mode = ADC_Mode_Independent;/ADC工作模式:ADC1和ADC2工作在獨立模式ADC_InitStruc

15、ture.ADC_ScanConvMode = DISABLE;/模數(shù)轉(zhuǎn)換工作在單通道模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;/模數(shù)轉(zhuǎn)換工作在單次轉(zhuǎn)換模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;/由軟件而不是外部觸發(fā)啟動ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/ADC數(shù)據(jù)右對齊ADC_InitStructure.ADC_NbrOfChannel = 1;/順序進行規(guī)則轉(zhuǎn)

16、換的ADC通道的數(shù)目ADC_Init(ADC1, &ADC_InitStructure);/根據(jù)ADC_InitStruct中指定的參數(shù)初始化外設(shè)ADCx的寄存器 ADC_Cmd(ADC1, ENABLE);/使能指定的ADC1ADC_ResetCalibration(ADC1);/使能復(fù)位校準(zhǔn) while(ADC_GetResetCalibrationStatus(ADC1);/等待復(fù)位校準(zhǔn)結(jié)束ADC_StartCalibration(ADC1); /開啟AD校準(zhǔn)while(ADC_GetCalibrationStatus(ADC1); /等待校準(zhǔn)結(jié)束/ADC_SoftwareStartCo

17、nvCmd(ADC1, ENABLE);/使能指定的ADC1的軟件轉(zhuǎn)換啟動功能 /獲得ADC值/ch:通道值 03u16 Get_Adc(u8 ch) /設(shè)置指定ADC的規(guī)則組通道,一個序列,采樣時間ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_71Cycles5 );/ADC1,ADC通道,采樣時間為71.5周期 ADC_SoftwareStartConvCmd(ADC1, ENABLE);/使能指定的ADC1的軟件轉(zhuǎn)換啟動功能while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC );/等待轉(zhuǎn)換結(jié)束

18、delay_us(3);return ADC_GetConversionValue(ADC1);/返回最近一次ADC1規(guī)則組的轉(zhuǎn)換結(jié)果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; /產(chǎn)生ACK應(yīng)答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;/不產(chǎn)生ACK應(yīng)答 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發(fā)送一個字節(jié)/返回從機有無應(yīng)答/1,有應(yīng)答/0,無應(yīng)答 void IIC_Send_Byte(u8 txd) u8 t; SDA_OUT(); IIC_SCL=0;/拉低時鐘開始數(shù)據(jù)傳輸 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個字節(jié),ack=1時,發(fā)送ACK,ack=0,發(fā)送nACK u8 IIC_Read_Byte(unsigned char ack)unsigned char i,receive=0;SDA_IN();/SDA設(shè)置為輸入 for(i=0;i8;i+ ) IIC_SCL=0; delay_us(2);IIC_SCL=1; receiveAT24C16)IIC_Send_Byte(0XA0); /發(fā)送寫命令I(lǐng)IC_Wait_Ack();IIC_Send_Byte(ReadAddr8);/發(fā)送高地址IIC_Wait_Ack();

21、else IIC_Send_Byte(0XA0+(ReadAddr/256)AT24C16)IIC_Send_Byte(0XA0); /發(fā)送寫命令I(lǐng)IC_Wait_Ack();IIC_Send_Byte(WriteAddr8);/發(fā)送高地址 elseIIC_Send_Byte(0XA0+(WriteAddr/256)1); /發(fā)送器件地址0XA0,寫數(shù)據(jù) IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr%256); /發(fā)送低地址IIC_Wait_Ack(); IIC_Send_Byte(DataToWrite); /發(fā)送字節(jié) IIC_Wait_Ack(); IIC

22、_Stop();/產(chǎn)生一個停止條件 delay_ms(10); /在AT24CXX里面的指定地址開始寫入長度為Len的數(shù)據(jù)/該函數(shù)用于寫入16bit或者32bit的數(shù)據(jù)./WriteAddr :開始寫入的地址 /DataToWrite:數(shù)據(jù)數(shù)組首地址/Len :要寫入數(shù)據(jù)的長度2,4void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len) u8 t;for(t=0;t(8*t)&0xff); /在AT24CXX里面的指定地址開始讀出長度為Len的數(shù)據(jù)/該函數(shù)用于讀出16bit或者32bit的數(shù)據(jù)./ReadAddr :開始讀出的地址 /返回值 :數(shù)據(jù)/Len :要讀出數(shù)據(jù)的長度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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論