娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月19日(星期一)

2018年05月19日 | STM32單片機(13) I2C讀寫AT24Cxx存儲器實驗

發布者:平靜的33號 來源: eefocus關鍵字:STM32  單片機  I2C  存儲器 手機看文章 掃描二維碼
隨時隨地手機看文章

本程序主要利用I2C串行總線,實現AT24Cxx系列EEPROM存儲器(此處是AT24C02)的讀寫,將數據寫入,再讀出發送至串口

可利用EEPROM存儲器數據斷電不消失性質存儲一些配置數據等。

主程序

/******************************************************************************* 

*    

* 軟件功能:  I2C讀寫AT24Cxx系列EEPROM存儲器 

*  

*******************************************************************************/  

#include "stm32f10x.h"  

#include  

#include "delay.h"  

#include "I2C.h"  

#include "AT24Cxx.h"  

    

void RCC_Configuration(void);  

void GPIO_Configuration(void);  

void USART1_Configuration(void);  

void Uart1_PutChar(u8 ch);  

void Uart1_PutString(u8* buf , u8 len);  

int fputc(int ch, FILE *f);  

                              

/************************************************* 

函數: int main(void) 

功能: main主函數 

參數: 無 

返回: 無 

**************************************************/  

int main(void)  

{  

  u16 tempdata=0;  

  u16 i=0;  

  RCC_Configuration();  

  GPIO_Configuration();  

  delay_init(72);  

  USART1_Configuration();  

  I2C_Configuration();  

  delay_ms(1);  

  

  

  for(i=0;i<255;i++)  

  {  

      AT24Cxx_WriteOneByte(i,i);  

  }             

  

  for(i=0;i<255;i++)  

  {  

      tempdata=AT24Cxx_ReadOneByte(i);  

      printf("%x ",tempdata);  

  }  

    

  

  //AT24Cxx_WriteTwoByte(0,0x1234);  

  //tempdata=AT24Cxx_ReadTwoByte(0);  

 // printf("兩個字節 dt=%x\n",tempdata);  

  

  while(1);  

}  

  

/************************************************* 

函數: void RCC_Configuration(void) 

功能: 復位和時鐘控制 配置 

參數: 無 

返回: 無 

**************************************************/  

void RCC_Configuration(void)  

{  

  ErrorStatus HSEStartUpStatus;                    //定義外部高速晶體啟動狀態枚舉變量  

  RCC_DeInit();                                    //復位RCC外部設備寄存器到默認值  

  RCC_HSEConfig(RCC_HSE_ON);                       //打開外部高速晶振  

  HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速時鐘準備好  

  if(HSEStartUpStatus == SUCCESS)                  //外部高速時鐘已經準別好  

  {  

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //開啟FLASH預讀緩沖功能,加速FLASH的讀取。所有程序中必須的用法.位置:RCC初始化子函數里面,時鐘起振之后  

    FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延時  

          

    RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)時鐘等于==SYSCLK  

    RCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)鐘==AHB時鐘  

    RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)鐘==AHB1/2時鐘  

           

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL時鐘 == 外部高速晶體時鐘 * 9 = 72MHz  

    RCC_PLLCmd(ENABLE);                                   //使能PLL時鐘  

     

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL時鐘就緒  

    {  

    }  

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系統時鐘 = PLL時鐘  

    while(RCC_GetSYSCLKSource() != 0x08)                  //檢查PLL時鐘是否作為系統時鐘  

    {  

    }  

  }  

    

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);  //允許 GPIOA、GPIOB、USART1、AFIO時鐘  

}  

  

/************************************************* 

函數: void GPIO_Configuration(void) 

功能: GPIO配置 

參數: 無 

返回: 無 

**************************************************/  

void GPIO_Configuration(void)  

{  

    

  GPIO_InitTypeDef GPIO_InitStructure;        //定義GPIO初始化結構體  

  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復合推挽輸出     

  GPIO_Init(GPIOA, &GPIO_InitStructure);       //PA9串口輸出  

    

}  

  

  

/******************************************************************************* 

    函數名:USART1_Configuration 

    輸  入: 

    輸  出: 

    功能說明: 

    初始化串口硬件設備,啟用中斷 

    配置步驟: 

    (1)打開GPIO和USART1的時鐘 

    (2)設置USART1兩個管腳GPIO模式 

    (3)配置USART1數據格式、波特率等參數 

    (4)使能USART1接收中斷功能 

    (5)最后使能USART1功能 

*/  

void USART1_Configuration(void)   //串口配置   詳見《STM32的函數說明(中文).pdf》P346  

{  

    USART_InitTypeDef USART_InitStructure;  

    USART_InitStructure.USART_BaudRate=9600;   //波特率為9600  

    USART_InitStructure.USART_WordLength=USART_WordLength_8b;  //數據位為8  

    USART_InitStructure.USART_StopBits=USART_StopBits_1; //在幀結尾傳輸 1 個停止位  

    USART_InitStructure.USART_Parity=USART_Parity_No; //校驗模式:奇偶失能  

    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制失能  

    USART_InitStructure.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //USART_Mode 指定了使能或者失能發送和接收模式:發送使能|接收失能  

    USART_Init(USART1, &USART_InitStructure);     //初始化配置  

  

    USART_Cmd(USART1,ENABLE);   //使能或者失能 USART 外設  

    USART_ClearFlag(USART1, USART_FLAG_TC);//清除傳輸完成標志位,否則可能會丟失第1個字節的數據.USART_FLAG_TC為發送完成標志位  

}  

  

  

//發送一個字符  

void Uart1_PutChar(u8 ch)  

{  

    USART_SendData(USART1, (u8) ch);  

    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待發送完成  

}  

  

//發送一個字符串 Input : buf為發送數據的地址 , len為發送字符的個數  

void Uart1_PutString(u8* buf , u8 len)  

{     

    u8 i;  

    for(i=0;i

    {  

        Uart1_PutChar(*(buf++));  

    }  

}  

  

int fputc(int ch, FILE *f)  

{  

Uart1_PutChar((u8)ch);  //此處為自定義函數,參見串口中斷通信,請勿盲目復制  

return (ch);  


I2C.h

#ifndef __I2C_H  

#define __I2C_H                  

#include "stm32f10x.h"  

  

//如果移植程序時只要改一下三個地方就行了  

#define I2C_SCL GPIO_Pin_6  

#define I2C_SDA GPIO_Pin_7  

#define GPIO_I2C GPIOB  

  

#define I2C_SCL_H GPIO_SetBits(GPIO_I2C,I2C_SCL)  

#define I2C_SCL_L GPIO_ResetBits(GPIO_I2C,I2C_SCL)  

  

#define I2C_SDA_H GPIO_SetBits(GPIO_I2C,I2C_SDA)  

#define I2C_SDA_L GPIO_ResetBits(GPIO_I2C,I2C_SDA)  

  

void I2C_Configuration(void);  

void I2C_SDA_OUT(void);  

void I2C_SDA_IN(void);  

void I2C_Start(void);  

void I2C_Stop(void);  

void I2C_Ack(void);  

void I2C_NAck(void);  

u8   I2C_Wait_Ack(void);  

void I2C_Send_Byte(u8 txd);  

u8   I2C_Read_Byte(u8 ack);  

#endif 


I2C.c

#include "delay.h"  

#include "I2C.h"  

  

void I2C_Configuration(void)  

{  

    GPIO_InitTypeDef GPIO_InitStructure;      

      

    GPIO_InitStructure.GPIO_Pin=I2C_SCL|I2C_SDA;  

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  

    GPIO_Init(GPIOB,&GPIO_InitStructure);  

  

    I2C_SCL_H;  

    I2C_SDA_H;  

}  

  

void I2C_SDA_OUT(void)  

{  

    GPIO_InitTypeDef GPIO_InitStructure;      

      

    GPIO_InitStructure.GPIO_Pin=I2C_SDA;  

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  

    GPIO_Init(GPIOB,&GPIO_InitStructure);  

}  

  

void I2C_SDA_IN(void)  

{  

    GPIO_InitTypeDef GPIO_InitStructure;      

      

    GPIO_InitStructure.GPIO_Pin=I2C_SDA;  

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  

    GPIO_Init(GPIOB,&GPIO_InitStructure);  

}  

  

//產生起始信號  

void I2C_Start(void)  

{  

    I2C_SDA_OUT();  

      

    I2C_SDA_H;  

    I2C_SCL_H;  

    delay_us(5);  

    I2C_SDA_L;  

    delay_us(6);  

    I2C_SCL_L;  

}  

  

//產生停止信號  

void I2C_Stop(void)  

{  

   I2C_SDA_OUT();  

  

   I2C_SCL_L;  

   I2C_SDA_L;  

   I2C_SCL_H;  

   delay_us(6);  

   I2C_SDA_H;  

   delay_us(6);  

}  

  

//主機產生應答信號ACK  

void I2C_Ack(void)  

{  

   I2C_SCL_L;  

   I2C_SDA_OUT();  

   I2C_SDA_L;  

   delay_us(2);  

   I2C_SCL_H;  

   delay_us(5);  

   I2C_SCL_L;  

}  

  

//主機不產生應答信號NACK  

void I2C_NAck(void)  

{  

   I2C_SCL_L;  

   I2C_SDA_OUT();  

   I2C_SDA_H;  

   delay_us(2);  

   I2C_SCL_H;  

   delay_us(5);  

   I2C_SCL_L;  

}  

//等待從機應答信號  

//返回值:1 接收應答失敗  

//        0 接收應答成功  

u8 I2C_Wait_Ack(void)  

{  

    u8 tempTime=0;  

  

    I2C_SDA_IN();  

  

    I2C_SDA_H;  

    delay_us(1);  

    I2C_SCL_H;  

    delay_us(1);  

  

    while(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))  

    {  

        tempTime++;  

        if(tempTime>250)  

        {  

            I2C_Stop();  

            return 1;  

        }      

    }  

  

    I2C_SCL_L;  

    return 0;  

}  

//I2C 發送一個字節  

void I2C_Send_Byte(u8 txd)  

{  

    u8 i=0;  

  

    I2C_SDA_OUT();  

    I2C_SCL_L;//拉低時鐘開始數據傳輸  

  

    for(i=0;i<8;i++)  

    {  

        if((txd&0x80)>0) //0x80  1000 0000  

            I2C_SDA_H;  

        else  

            I2C_SDA_L;  

  

        txd<<=1;  

        I2C_SCL_H;  

        delay_us(2); //發送數據  

        I2C_SCL_L;  

        delay_us(2);  

    }  

}  

  

//I2C 讀取一個字節  

  

u8 I2C_Read_Byte(u8 ack)  

{  

   u8 i=0,receive=0;  

  

   I2C_SDA_IN();  

   for(i=0;i<8;i++)  

   {  

        I2C_SCL_L;  

        delay_us(2);  

        I2C_SCL_H;  

        receive<<=1;  

        if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))  

           receive++;  

        delay_us(1);      

   }  

  

    if(ack==0)  

        I2C_NAck();  

    else  

        I2C_Ack();  

  

    return receive;  

}  

AT24Cxx.h

#ifndef _AT24Cxx_H  

#define _AT24Cxx_H  

#include "stm32f10x.h"  

#include "I2C.h"  

#include "delay.h"  

  

#define AT24C01  127  

#define AT24C02  255  

#define AT24C04  511  

#define AT24C08  1023  

#define AT24C16  2047  

#define AT24C32  4095  

#define AT24C64  8191  

#define AT24C128 16383  

#define AT24C256 32767  

  

#define EE_TYPE  AT24C02  

  

u8 AT24Cxx_ReadOneByte(u16 addr);  

u16 AT24Cxx_ReadTwoByte(u16 addr);  

void AT24Cxx_WriteOneByte(u16 addr,u8 dt);  

void AT24Cxx_WriteTwoByte(u16 addr,u16 dt);  

  

  

#endif  


AT24Cxx.c

#include "AT24Cxx.h"  

  

  

u8 AT24Cxx_ReadOneByte(u16 addr)  

{  

    u8 temp=0;  

  

    I2C_Start();  

      

    if(EE_TYPE>AT24C16)  

    {  

        I2C_Send_Byte(0xA0);  

        I2C_Wait_Ack();  

        I2C_Send_Byte(addr>>8);   //發送數據地址高位  

    }  

    else  

    {  

       I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+數據地址  

    }  

  

    I2C_Wait_Ack();  

    I2C_Send_Byte(addr%256);//雙字節是數據地址低位          

                            //單字節是數據地址低位  

    I2C_Wait_Ack();  

  

    I2C_Start();  

    I2C_Send_Byte(0xA1);  

    I2C_Wait_Ack();  

  

    temp=I2C_Read_Byte(0); //  0   代表 NACK  

    I2C_Stop();  

      

    return temp;      

}  

  

u16 AT24Cxx_ReadTwoByte(u16 addr)  

{  

    u16 temp=0;  

  

    I2C_Start();  

      

    if(EE_TYPE>AT24C16)  

    {  

        I2C_Send_Byte(0xA0);  

        I2C_Wait_Ack();  

        I2C_Send_Byte(addr>>8);   //發送數據地址高位  

    }  

    else  

    {  

       I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+數據地址  

    }  

  

    I2C_Wait_Ack();  

    I2C_Send_Byte(addr%256);//雙字節是數據地址低位          

                            //單字節是數據地址低位  

    I2C_Wait_Ack();  

  

    I2C_Start();  

    I2C_Send_Byte(0xA1);  

    I2C_Wait_Ack();  

  

    temp=I2C_Read_Byte(1); //  1   代表 ACK  

    temp<<=8;  

    temp|=I2C_Read_Byte(0); //  0  代表 NACK  

  

    I2C_Stop();  

      

    return temp;      

}  

  

  

void AT24Cxx_WriteOneByte(u16 addr,u8 dt)  

{  

    I2C_Start();  

  

    if(EE_TYPE>AT24C16)  

    {  

        I2C_Send_Byte(0xA0);  

        I2C_Wait_Ack();  

        I2C_Send_Byte(addr>>8);   //發送數據地址高位  

    }  

    else  

    {  

       I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+數據地址  

    }  

  

    I2C_Wait_Ack();  

    I2C_Send_Byte(addr%256);//雙字節是數據地址低位          

                            //單字節是數據地址低位  

    I2C_Wait_Ack();  

  

    I2C_Send_Byte(dt);  

    I2C_Wait_Ack();  

    I2C_Stop();  

  

    delay_ms(10);  

}  

  

void AT24Cxx_WriteTwoByte(u16 addr,u16 dt)  

{  

    I2C_Start();  

  

    if(EE_TYPE>AT24C16)  

    {  

        I2C_Send_Byte(0xA0);  

        I2C_Wait_Ack();  

        I2C_Send_Byte(addr>>8);   //發送數據地址高位  

    }  

    else  

    {  

       I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+數據地址  

    }  

  

    I2C_Wait_Ack();  

    I2C_Send_Byte(addr%256);//雙字節是數據地址低位          

                            //單字節是數據地址低位  

    I2C_Wait_Ack();  

  

    I2C_Send_Byte(dt>>8);  

    I2C_Wait_Ack();  

  

    I2C_Send_Byte(dt&0xFF);  

    I2C_Wait_Ack();  

  

    I2C_Stop();  

  

    delay_ms(10);  

}  



關鍵字:STM32  單片機  I2C  存儲器 引用地址:STM32單片機(13) I2C讀寫AT24Cxx存儲器實驗

上一篇:s3c2440_LCD控制器設置及代碼詳解
下一篇:STM32單片機(12) 紅外信號接收解碼(外部中斷)

推薦閱讀

本文導讀頻率是信號最核心的特征之一,但工程師常有這種困惑:為什么硬件頻率計和示波器頻率測量結果不同呢?哪個數據才更精確呢?來聽聽資深硬件工程師的原理剖析分享。一、頻率測量原理所謂“頻率”,就是周期性信號在單位時間(秒)內變化的次數。若在一定的時間間隔T內計數,計得某周期性信號的重復變化次數為N,則該信號的頻率可表達為:f = N / T...
通常情況下,你是為了最好地連接和保持一切正常工作,這只是為了得到一個很好的視覺效果。如果你想從你的項目中拍照,或者想用一個好看的原型給客戶留下深刻的印象,你必須更加注意細節。 需要的設備 俗話說工欲善其事、必先利其器,這話一點沒錯,在開始項目之前,你必須準備以下設備。 首先,你真的需要一個好的焊接站。品牌并不重要,重要的是性能...
(文章來源:cnBeta.COM) 雖然現在汽車制造過程的許多方面都已實現了自動化,但焊縫的檢查通常仍由人類來完成。德國正在開發的一種新的機器人系統應能使這些焊縫的檢查比以往任何時候都更容易、更準確。目前,單個汽車零部件必須手動裝入一個旋轉的設備上,這樣就可以從各個角度對其進行旋轉和觀察。即便如此,工人們也常常會采取尷尬的姿勢來查看焊縫...
全球最大的汽車零配件供應商博世(Bosch)近日指出,汽車半導體供應緊張的趨勢可能會持續到2022年。圖源:網絡該公司首席執行官Volkmar Denner在接受《法蘭克福匯報》(Frankfurer Allgemeine Zeitung)采訪時表示,汽車芯片緊缺問題無法在短期內解決。“我們還將面臨數月的艱難時期,這種狀況可能會持續到2022年。”大眾集團(VOWG)本月初表示,由于...

史海拾趣

問答坊 | AI 解惑

數字示波器

我做的示波器…

查看全部問答∨

arm資料

ARM應用系統開發詳解——基于S3C4510B的…

查看全部問答∨

第二屆ARM中國微控制器技術研討會

你知道嗎?ARM每年可派出40億個處理器,全球超過四分之一的電子產品使用了ARM技術,其中,以微控制器為主的嵌入式應用是未來10年增長最快的領域。 伴隨著授權數量的增長,支持ARM微控制器內核的生態系統也在蓬勃發展,包括工具、中間件和 ...…

查看全部問答∨

xilinx usb 下載線

Xilinx platform cable usb(Xilinx 下載線) 1.目標器件VCC兼容 1.5V--5V 2.可配置所有Xilinx器件 3.支持iMPACT 和ChipScope 4.支持JTAG和Slave Serial配置模式 5.目標器件下載時鐘可選,最高可達24 MHz 6.LED狀態指示燈指示目標器件電 ...…

查看全部問答∨

嵌入式 初學者問題!!

我學過c,java, 理解還可以!我想學嵌入式!曾經學過單片機,但基礎很差!有人告訴我 先從單片機學起! 我需要 買板子嗎?是不是 需要兩塊板子!一個先學單片機,一個學arm! 有沒有 一塊板子,都可以學的! 我還需要學哪些方面!   ...…

查看全部問答∨

關于擴展串口,如何連接的問題?

我想用2410擴展一個串口,請問那位知道擴展串口的原理?…

查看全部問答∨

關于USB驅動的問題

想在PXA270板子上使用內置USB設備,涉及驅動結構 USBFN<--->USBD|HCD 如果我想用外接USB設備,就要涉及USB ROOT HUB的驅動, 請問USB ROOT HUB驅動是在上述結構的什么位置? USBFN里面對內置和外置USB設備處理有沒有不同? 小弟初學,表述 ...…

查看全部問答∨

【免費下載】2008年全國11城市STM32技術研討會演講稿已經上線

請訪問ST中文網頁:http://www.stmicroelectronics.com.cn/  在最左邊“產品”欄目點擊“微控制器”    在“大中華地區相關信息”欄目點擊“中國大陸地區”      在“STM32  ...…

查看全部問答∨

149與微型打印機的連接?

微型打印機是5v供電的,26線雙排針型插座 打印機的輸入信號DB0~DB7,用3.3v到5v的轉換芯片4245 那么打印機的輸出信號ACK,BUSY想直接接到149行么…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 贵南县| 北宁市| 依兰县| 双城市| 太湖县| 剑河县| 城口县| 区。| 东明县| 会昌县| 股票| 历史| 平和县| 云龙县| 孟连| 西城区| 运城市| 沂南县| 枞阳县| 巴彦县| 台湾省| 德钦县| 盐亭县| 汉川市| 胶南市| 友谊县| 威宁| 合水县| 古蔺县| 罗源县| 达拉特旗| 博乐市| 贺兰县| 弋阳县| 朝阳县| 克拉玛依市| 收藏| 谷城县| 余姚市| 福海县| 恩平市|