STM32F103讀寫24C02程序,使用過肯定能用_第1頁
STM32F103讀寫24C02程序,使用過肯定能用_第2頁
STM32F103讀寫24C02程序,使用過肯定能用_第3頁
已閱讀5頁,還剩6頁未讀, 繼續(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; /GPIO ErrorStatus 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 GPIO_P

3、in_7 /I2C 數據*宏定#define SCL(x)x ? GPIO_SetBits(GPIOF , SCLK): GPIO_ResetBits(GPIOF , SCLK)*#define SDA(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_us_24C02(1);SCL(1);

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

5、大于4卩sDelay_us_24C02(5);SDA(O); 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=O表示被控器無應答或損壞。*/void SendByte(unsigned char c)unsigned char BitCnt;for(BitCnt=0;BitCnt<8;BitCnt+)/要傳送的數

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

7、it(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=0;SDA(1); /SDA=1 置數據線為輸入方式 for(BitCnt=0;BitCnt<8;BitCnt+)Del

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

9、應答子函數函數原型 : 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); /時鐘低電平周期大于 4卩sSCL(0) ;/SCL=0; 清時鐘線,鉗住 I2C 總線以便繼續(xù)接收Delay_us_24C02(2);/AT2402 的功能函數/* 向有子地址器件發(fā)送多字節(jié)數據函數函數原型 : bi

10、t 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,unsigned char no) unsigned char i;Start_I2c();SendByte(sla); if(ack=0)ret

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

12、,讀出的容放入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); if(ack=0)return(0); SendByte(suba); if(ack=0)return(0);Start_I2c();SendByte(sla+1); if(ack=0)return(0); for(i=0;i&

13、lt;no-1;i+)/* 啟動總線 */* 發(fā)送器件地址 */* 發(fā)送器件子地址 */* 重新啟動總線 */*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-);void Delay_us_24C02(u32 nTime) unsigned int USEC = 0;while(USEC != 10000) USEC+;

14、int main()#ifdef DEBUGdebug(); / 在線調試使用#endifRCC_Configuration();/系統時鐘配置函數/NVIC_Configuration(); /NVIC 配置函數/SysTick_Configuration(); /Systick 配置函數/啟動 GPIO 模塊時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);/把調試設置普通 IO 口 GPIO_PinRemapConfig(GPIO_Remap_SW

15、J_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; /輸出的最大頻率為 GPIO_Init(GPIOB, &GPIO_InitStructure);/初始化 GPIOB 端口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; / 所有 GPI

16、O 為同一類型端口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;/推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /輸出的最大頻率為 GPIO_Init(GPIOF, &GPIO_InitStructure);/初始化 GPIOB 端口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;/開漏輸出GPIO_InitStructure.GPIO_Spe

17、ed = GPIO_Speed_50MHz; /輸出的最大頻率為 GPIO_Init(GPIOF, &GPIO_InitStructure);/初始化 GPIOA 端口GPIO_Write(GPIOB,0xffff); /將 GPIOB 16 個端口全部置為高電50HZ50HZ50HZwhile(1)/=IIC 讀取if(Readzfc = 1)IRcvStr(AT24C02,0,&R_Dat0,8);Readzfc = 0;if(R_Dat2 = 0x55)GPIO_Write(GPIOB,0xffff);Delay(0x3fffff);GPIO_Write(GPIOB,0x

18、0000);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);/等待外部高速時鐘準備好HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus = SUCCESS) / 外部高速時鐘已經準

19、別好/開啟 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);配置 APBI(PCLKI)鐘=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_FL

溫馨提示

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

評論

0/150

提交評論