STM32F103讀寫24C02程序,使用過肯定能用_第1頁
STM32F103讀寫24C02程序,使用過肯定能用_第2頁
STM32F103讀寫24C02程序,使用過肯定能用_第3頁
STM32F103讀寫24C02程序,使用過肯定能用_第4頁
STM32F103讀寫24C02程序,使用過肯定能用_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、/實驗24C02連接在PF口/WP、A0、A1、A2都接地 #include "stm32f10x_flash.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #define AT24C02 0xa0 /AT24C02 地址/* 變量定義 -*/GPIO_InitTypeDef GPIO_InitStructure; /GPIOErrorStatus HSEStartUpStatus;unsigned char Count1 , Count2;unsigned int

2、 USEC;static vu32 TimingDelay;unsigned char Readzfc;unsigned char pDat8 = 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55;unsigned char R_Dat8;/*聲明函數 -*/void RCC_Configuration(void);void SysTick_Configuration(void);void Delay_us_24C02(u32 nTime);/*24C02硬件接口*/ #define SData GPIO_Pin_6 /I2C 時鐘 #define SCLK GP

3、IO_Pin_7 /I2C 數據 /*宏定義*/#define SCL(x)x ? GPIO_SetBits(GPIOF , SCLK) : GPIO_ResetBits(GPIOF , SCLK)#defineSDA(x) x ? GPIO_SetBits(GPIOF , SData) : GPIO_ResetBits(GPIOF , SData) /*變量*/u8 ack;/* 起動總線函數 函數原型: void Start_I2c(); 功能: 啟動I2C總線,即發(fā)送I2C起始條件. */void Start_I2c() SDA(1); /SDA=1; 發(fā)送起始條件的數據信號 Delay

4、_us_24C02(1); SCL(1); /SCL=1; Delay_us_24C02(5); /起始條件建立時間大于4.7us,延時 SDA(0); /SDA=0; /*發(fā)送起始信號*/ Delay_us_24C02(5); / 起始條件鎖定時間大于4s SCL(0); /SCL=0; /*鉗住I2C總線,準備發(fā)送或接收數據 */ Delay_us_24C02(2);/* 結束總線函數 函數原型: void Stop_I2c(); 功能: 結束I2C總線,即發(fā)送I2C結束條件. */void Stop_I2c() SDA(0); /SDA=0; /發(fā)送結束條件的數據信號 Delay_us_

5、24C02(1); /發(fā)送結束條件的時鐘信號 SCL(1); /SCL=1; 結束條件建立時間大于4s Delay_us_24C02(5); SDA(0); /SDA=1; 發(fā)送I2C總線結束信號 Delay_us_24C02(4);/* 字節(jié)數據發(fā)送函數 函數原型: void SendByte(UCHAR c);功能: 將數據c發(fā)送出去,可以是地址,也可以是數據,發(fā)完后等待應答,并對 此狀態(tài)位進行操作.(不應答或非應答都使ack=0) 發(fā)送數據正常,ack=1; ack=0表示被控器無應答或損壞。*/void SendByte(unsigned char c) unsigned char B

6、itCnt; for(BitCnt=0;BitCnt<8;BitCnt+) /要傳送的數據長度為8位 if(c<<BitCnt)&0x80) SDA(1); /SDA=1; 判斷發(fā)送位 else SDA(0); / SDA=0 Delay_us_24C02(1); SCL(1); /SCL=1 置時鐘線為高,通知被控器開始接收數據位 Delay_us_24C02(5); /保證時鐘高電平周期大于4s SCL(0); /SCL = 0 Delay_us_24C02(2); SDA(1); /SDA=1 位發(fā)送完后釋放數據線,準備接收應答位Delay_us_24C02(2

7、); SCL(1); /SCL=1 Delay_us_24C02(3); if(GPIO_ReadInputDataBit(GPIOF ,SData)=1)ack=0; else ack=1; /判斷是否接收到應答信號 SCL(0); /SCL=0; Delay_us_24C02(3);/* 字節(jié)數據接收函數 函數原型: UCHAR RcvByte();功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發(fā)應答信號), 發(fā)完后請用應答函數應答從機。 */ unsigned char RcvByte() unsigned char retc; unsigned char BitCnt; retc

8、=0; SDA(1); /SDA=1 置數據線為輸入方式 for(BitCnt=0;BitCnt<8;BitCnt+) Delay_us_24C02(1); SCL(0); /SCL=0 置時鐘線為低,準備接收數據位Delay_us_24C02(5); /時鐘低電平周期大于4.7s SCL(1); /SCL=1 置時鐘線為高使數據線上數據有效 Delay_us_24C02(2); retc=retc<<1; if(GPIO_ReadInputDataBit(GPIOF , SData)= 1)retc=retc+1; / SDA = 1讀數據位,接收的數據位放入retc中 D

9、elay_us_24C02(2); SCL(0); / SCL=0; Delay_us_24C02(2); return(retc);/* 應答子函數函數原型: void Ack_I2c(bit a);功能: 主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)*/void Ack_I2c(u8 a) if(a=0) SDA(0); /SDA=0;在此發(fā)出應答或非應答信號 else SDA(1); /SDA=1; Delay_us_24C02(3); SCL(1); /SCL=1; Delay_us_24C02(4);/時鐘低電平周期大于4s SCL(0); /SCL=0; 清時鐘線,

10、鉗住I2C總線以便繼續(xù)接收 Delay_us_24C02(2); /AT2402的功能函數/* 向有子地址器件發(fā)送多字節(jié)數據函數 函數原型: bit ISendStr(UCHAR sla,UCHAR suba,ucahr *s,UCHAR no); 功能: 從啟動總線到發(fā)送地址,子地址,數據,結束總線的全過程,從器件 地址sla,子地址suba,發(fā)送內容是s指向的內容,發(fā)送no個字節(jié)。 如果返回1表示操作成功,否則操作有誤。注意: 使用前必須已結束總線。*/u8 ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,uns

11、igned char no) unsigned char i; Start_I2c(); /*啟動總線*/ SendByte(sla); /*發(fā)送器件地址*/ if(ack=0)return(0); SendByte(suba); /*發(fā)送器件子地址*/ if(ack=0)return(0); for(i=0;i<no;i+) SendByte(*s); /*發(fā)送數據*/ if(ack=0)return(0); s+; Stop_I2c(); /*結束總線*/ return(1);/* 向有子地址器件讀取多字節(jié)數據函數 函數原型: bit RecndStr(UCHAR sla,UCHAR

12、 suba,ucahr *s,UCHAR no); 功能: 從啟動總線到發(fā)送地址,子地址,讀數據,結束總線的全過程,從器件 地址sla,子地址suba,讀出的內容放入s指向的存儲區(qū),讀no個字節(jié)。 如果返回1表示操作成功,否則操作有誤。注意: 使用前必須已結束總線。*/u8 IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) unsigned char i; Start_I2c(); /*啟動總線*/ SendByte(sla); /*發(fā)送器件地址*/ if(ack=0)return(0

13、); SendByte(suba); /*發(fā)送器件子地址*/ if(ack=0)return(0); Start_I2c(); /*重新啟動總線*/ SendByte(sla+1); if(ack=0)return(0); for(i=0;i<no-1;i+) *s=RcvByte(); /*發(fā)送數據*/ Ack_I2c(0); /*發(fā)送就答位*/ s+; *s=RcvByte(); Ack_I2c(1); /*發(fā)送非應位*/ Stop_I2c(); /*結束總線*/ return(1);void Delay(vu32 nCount) for(; nCount != 0; nCount-

14、);void Delay_us_24C02(u32 nTime)unsigned int USEC = 0; while(USEC != 10000) USEC+; int main() #ifdef DEBUGdebug(); /在線調試使用#endifRCC_Configuration(); /系統時鐘配置函數 /NVIC_Configuration(); /NVIC配置函數 /SysTick_Configuration(); /Systick配置函數/啟動GPIO模塊時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_

15、GPIOB|RCC_APB2Periph_AFIO, ENABLE);/把調試設置普通IO口GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; /所有GPIO為同一類型端口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /輸出的最大頻率為50HZGPIO_Init(GPIOB, &GPIO_

16、InitStructure); /初始化GPIOB端口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; /所有GPIO為同一類型端口GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /輸出的最大頻率為50HZGPIO_Init(GPIOF, &GPIO_InitStructure); /初始化GPIOB端口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;

17、GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /開漏輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /輸出的最大頻率為50HZGPIO_Init(GPIOF, &GPIO_InitStructure); /初始化GPIOA端口GPIO_Write(GPIOB,0xffff); /將GPIOB 16個端口全部置為高電 while(1) /=IIC 讀取 if(Readzfc = 1) IRcvStr(AT24C02,0,&R_Dat0,8); Readzfc = 0; i

18、f(R_Dat2 = 0x55)GPIO_Write(GPIOB,0xffff);Delay(0x3fffff);GPIO_Write(GPIOB,0x0000);Delay(0x3fffff); Readzfc = 0; if(Readzfc = 0) ISendStr(AT24C02,0, &pDat0,8); Readzfc = 1; /* 配置RCC*/void RCC_Configuration(void) /復位RCC外部設備寄存器到默認值 RCC_DeInit(); /打開外部高速晶振 RCC_HSEConfig(RCC_HSE_ON); /等待外部高速時鐘準備好 HSE

19、StartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus = SUCCESS) /外部高速時鐘已經準別好 /開啟FLASH的預取功能 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /FLASH延遲2個周期 FLASH_SetLatency(FLASH_Latency_2); /配置AHB(HCLK)時鐘=SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); /配置APB2(PCLK2)鐘=AHB時鐘 RCC_PCLK2Config(RCC_HCLK_Div1); /配置APB1(PCLK1)鐘=AHB 1/2時鐘 RCC_PCLK1Config(RCC_HCLK_Div2); /配置PLL時鐘 = 外部高速晶體時鐘*9 PLLCLK = 8MHz * 9 = 72 MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /使能PLL時鐘 RCC_PLLCmd(ENABLE); /等待PLL時鐘就緒 while(RCC_GetFlagStatus(RCC_FLAG_PLL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論