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

歷史上的今天

今天是:2024年10月20日(星期日)

正在發生

2021年10月20日 | mini2440裸機編程-----IIC—讀寫AT24C08

發布者:CaptivatingGaze 來源: eefocus關鍵字:mini2440  裸機編程  IIC 手機看文章 掃描二維碼
隨時隨地手機看文章

開始弄2440的裸機編程,爭取盡快從最底層把這些硬件都熟悉掌握。


最初始從配置裸機開發環境開始的,本來想用jlink+ADS來進行下載,結果用ADS的調試器AXD通過jlink進行下載的時候,軟件總是出現各種問題,這個問題折騰了有10天的時間,浪費了很長時間,最后重裝了系統,都沒有搞定。最后決定還是通過ADS來編譯,然后用supervivi來進行下載了。現在經常出現的問題是 usb下載器總是識別不到,而且有時會導致電腦重啟,應該是友善之臂提供的usb的驅動的問題,這些問題經常導致我折騰很長時間,心情很沮喪。有碰到并解決了類似問題的同學可以給我留個言。閑話少敘。


最開始寫了uart的驅動試驗,然后做了iic和iis的試驗。先記錄iic的試驗,以后再補上uart的部分。


IIC(Inter-Integrated Circuit,I2C)總線是一種由PHILIPS公司開發的兩線式串行總線,用于連接微處理器及其外圍設備,它只需要數據線SDA和時鐘線SCL,就能夠實現CPU與被控IC之間、IC與IC之間進行雙向傳送。


s3c2440內部有一個IIC總線接口,因此為我們連接帶有IIC通信模塊的外圍設備提供了便利。它具有四種操作模式:主設備發送模式、主設備接收模式、從設備發送模式和從設備接收模式。在這里我們只把s3c2440當做IIC總線的主設備來使用,因此只介紹前兩種操作模式。


在主設備發送模式下,它的工作流程為:


1. 配置IIC模式,然后把從設備地址寫入接收發送數據移位寄存器IICDS中,再把0xF0寫入控制狀態寄存器IICSTAT中,這時等待從設備發送應答信號,如果想要繼續發送數據,那么在接收到應答信號后,再把待發送的數據寫入寄存器IICDS中,清除中斷標志后,再次等待應答信號;如果不想再發送數據了,那么把0x90寫入寄存器IICSTAT中,清除中斷標志并等待停止條件后,即完成了一次主設備的發送。


在主設備接收模式下,它的工作流程為:


1. 配置IIC模式,然后把從設備地址寫入接收發送數據移位寄存器IICDS中,再把0xB0寫入控制狀態寄存器IICSTAT中,這時等待從設備發送應答信號,如果想要接收數據,那么在應答信號后,讀取寄存器IICDS,清除中斷標志;如果不想接收數據了,那么就向寄存器IICSTAT寫入0x90,清除中斷標志并等待停止條件后,即完成了一次主設備的接收。


數據手冊中有兩個流程圖,非常清晰。在完成上述兩個模式時,主要用到了控制寄存器IICCON、控制狀態寄存器IICSTAT和發送接收數據移位寄存器IICDS。由于我們只把s3c2440當做主設備來用,并且系統的IIC總線上只有這么一個主設備,因此用來設置從設備地址的地址寄存器IICADD,和用于仲裁總線的多主設備線路控制寄存器IICLC都無需配置。寄存器IICCON的第6位和低4位用于設置IIC的時鐘頻率,因為IIC的時鐘線SCL都是由主設備提供的。s3c2440的IIC時鐘源為PCLK,當系統的PCLK為50MHz,而從設備最高需要100kHz時,可以將IICCON的第6位置1,IICCON的低4位全為0即可。寄存器IICCON的第7位用于設置是否發出應答信號,第5位用于是否使能發送和接收中斷,第4位用于中斷的標志,當接收或發送數據后一定要對該位進行清零,以清除中斷標志。寄存器IICSTAT的高2位用于設置是哪種操作模式,當向第5位寫0或寫1時,則表示結束IIC或開始IIC通訊,第4位用于是否使能接收/發送數據。


由于通訊是雙方的事情,在了解了主設備的操作模式后,還要清楚從設備的運行機制,兩者要達到完美地結合,才能實現彼此的通訊。在這里,從設備是EEPROM——AT24C08。在看到的趙老師的博客中,他是對AT24c02a進行的讀寫。我覺得這兩個eeprom基本上是一樣的。


要想讓s3c2440能夠正確地對AT24C02A讀寫,就必須讓s3c2440的時序完全按照AT24C02A的時序。AT24C02A的寫操作有兩種模式:字節寫和頁寫。字節寫是先接收帶有寫命令的設備地址信息,如果符合就應答,再接收設備內存地址信息,發出應答后,再接收要寫入的數據,這樣就完成了字節寫過程。頁寫與字節寫的區別就是,頁寫可以一次寫多個數據,而字節寫只能一次寫一個數據。但由于AT24C02A的一頁才8個字節,所以頁寫也最多寫8個數據,而且只能在該頁內寫,不會發生一次頁寫同時寫兩頁的情況。AT24C02A的讀操作有三種模式:當前地址讀、隨機讀和序列讀。當前地址讀是只能讀取當前地址內的數據,它的時序是先接收帶有讀命令的設備地址信息,如果符合就應答,然后發送當前地址內的數據,在沒有接收從主設備發來的應答信號的情況下終止該次操作。隨機讀的時序是,連續接收帶有寫命令的設備地址信息和設備內存地址信息,然后主設備重新開啟IIC通信,AT24C02A再次接收到帶有讀命令的設備地址信息,在發出應答信號以后,發送該內存地址的數據,在沒有接收到任何應答信號的情況下結束該次通信。當前地址讀和隨機讀一次都只能讀取一個數據,而序列讀一次可以讀取若干個數據,它的時序就是在當前地址讀或隨機讀發出數據后,接收到了應答信號,那么AT24C02A會把下一個內存地址中的數據送出,除非AT24C02A接收不到任何應答信號,否則它會一直把下一個內存地址中的數據送出。序列讀沒有一頁8個字節的限制。


這里是趙老師寫的注意事項:


⑴清IIC中斷標志語句rIICCON &= ~0x10;一定要在讀寫寄存器IICDS的后面,不能放到它的前面;


⑵在等待應答的死循環while內,一定要加上延時的程序;


⑶在讀取AT24C02A數據時,當讀到最后一個數據時,一定不能讓s3c2440發送應答信號,否則以后會無法再讀取AT24C02A數據,除非關電重啟;


⑷在真正對AT24C02A進行讀取數據時,在發送帶有讀命令的從設備地址后,AT24C02A會再返回一個從設備地址信息或從設備內存地址信息作為應答,所以一定要把該字節讀取后拋棄,因為它不是我們所要讀取的信息;(這里在看at24c08的數據手冊中,并沒有看到有這個。)


⑸按照AT24C02A的時序,在發送從設備地址字節時,它的最低位是0表示寫,1表示讀。但對于s3c2440來說,不用人為設置這一位,即是0是1都無所謂,因為這一位是由s3c2440根據是主設備發送模式還是主設備接收模式來自動設置。


我把趙老師的源程序,修改了一下,經過反復試驗,剛開始弄錯了i2c地址,結果只實現了eeprom的寫入,讀數據時,讀出來的都是0xff。


趙老師的程序中,讀取數據的函數如下


void rd24c02a(unsigned char wordAddr,unsigned char *buffer,int sizeofdate )

{

       int i;

       unsigned char temp;

       flag =1;

       rIICDS = devAddr;                     //

       rIICCON &= ~0x10;            //清中斷標志

       rIICSTAT = 0xf0;                 //主設備發送模式

       while(flag)

              delay(100);

      

       flag = 1;

       rIICDS = wordAddr;

       rIICCON &= ~0x10;

       while(flag)

              delay(100);

             

       flag = 1;

       rIICDS =  devAddr;            //

       rIICCON &= ~0x10;           

       rIICSTAT = 0xb0;                //主設備接收模式

       while (flag)

              delay(100);

             

       flag = 1;

       temp = rIICDS;                //讀取從設備地址, 這小段程序按照24c08的手冊,我覺得是完全沒必要的。

       rIICCON &= ~0x10;

       while(flag)

              delay(100);

 

//連續讀

       for(i=0;i       {

              flag = 1;

              if(i==sizeofdate-1)                             //如果是最后一個數據

                     rIICCON &= ~0x80;                   //不再響應

              *(buffer+i) = rIICDS;

              rIICCON &= ~0x10;

              while(flag)

                     delay(100);

       }

      

       rIICSTAT = 0x90;         //結束該次通訊

       rIICCON = 0xe0;          //

      

       delay(100);                         

}


后來我修改了i2c地址之后,程序可以實現正確的讀寫。令我不解的是,為什么當i2c地址是錯誤時,mcu仍然可以收到ack信號,并且進入中斷函數呢?下面附上我的源程序。

#include

#include

 

#include "def.h"

#include "option.h"

#include "2440addr.h"     

#include "2440lib.h"

#include "2440slib.h"    

#include "mmu.h"  

#include "led.h"

 

unsigned char flag;                  //應答標志

unsigned char comm;                  //命令

//unsigned char devAddr=0x10 << 1;          //從設備AT24C02A的地址

unsigned char devAddr=0xa0 << 1; //從設備AT24C02A的地址 

//IIC通信中斷

void __irq IicISR(void)

{

  //   rSRCPND |= 0x1<<27;

  //   rINTPND |= 0x1<<27;

  

   ClearPending(BIT_IIC);

       flag = 0;                //清標志

       led_toggle(2);

}

  

 

//AT24C02A頁寫,當sizeofdate為1時,是字節寫

//輸入參數依次為設備內存地址、IIC數據緩存數組和要寫入的數據個數

void wr24c02a(char wordAddr, char *buffer,int len )

{

       int i;

   char mbuf[4];

   

   while(1) {

   i = rIICSTAT;

   if(i & (0x01<<5)){

      Uart_Send("bus busy",10);

      delay(100);

   } else

     break;

     }

   

       flag =1;                     //應答標志

       

       rIICDS = devAddr;

       rIICCON &= ~0x10;            //清中斷標志

       rIICSTAT = 0xf0;             //主設備發送模式

       while(flag == 1)             //等待從設備應答,

              delay(100);           //一旦進入IIC中斷,即可跳出該死循環

       Uart_Send("a",1); 

   

       flag = 1;

       rIICDS = wordAddr;            //寫入從設備內存地址

       rIICCON &= ~0x10;

       while(flag)

              delay(100);

 

   Uart_Send("b",1);  

//連續寫入數據

       for(i=0;i       {

              flag = 1;

              rIICDS = *(buffer+i);

              rIICCON &= ~0x10;

              while(flag)

                     delay(100);

  

  mbuf[0] = *(buffer + i);

  mbuf[1] = '.';

   Uart_Send(mbuf, 2);

       }

      

       rIICSTAT = 0xd0;         //發出stop命令,結束該次通訊

       rIICCON = 0xe0;          //為下次IIC通訊做準備

      

       delay(100);                   //等待

}

 

//AT24C02A的序列讀,當sizeofdate為1時,是隨機讀

//輸入參數依次為設備內存地址、IIC數據緩存數組和要讀取的數據個數

void rd24c02a(char wordAddr,char *buffer,int len )

{

       int i;

       unsigned char temp;

   char mbuf[12];

   

   while(1) {

   i = rIICSTAT;

   if(i & (0x01<<5)){

      Uart_Send("bus busy",10);

      delay(100);

   } else

     break;

     }

   

       flag =1;

       rIICDS = devAddr ;                     //

       rIICCON &= ~0x10;            //清中斷標志

       rIICSTAT = 0xf0;             //主設備發送模式

       while(flag)

[1] [2]
關鍵字:mini2440  裸機編程  IIC 引用地址:mini2440裸機編程-----IIC—讀寫AT24C08

上一篇:mini2440裸機編程--------LCD驅動
下一篇:mini2440上dm9000驅動分析(三)

推薦閱讀

集微網消息,市場研究機構Frost & Sullivan數據顯示,2017年按營收計,比特大陸已是全球最大的基于ASIC的加密貨幣礦機公司,占據全球74.5%的市場份額。該公司在最近的招股書中表示,公司是“專門從事比特幣、比特幣現金、以太幣、萊特幣、達世幣和Zcash等加密貨幣挖礦ASIC芯片的前端及后端設計,并與業內領先的生產合作伙伴制造芯片及硬件產品。”據比特...
“經常尋找‘迷路’的它,掃的不干凈還需人工掃、清理塵盒易揚塵影響我們的健康”作為一款能幫我們減輕家庭負擔的智能掃地機,似乎并沒有讓我們省心省力。致力打造家居清潔服務的一站式解決方案的聯想,推出了全球首款自動集塵的掃拖一體機器人,自動集塵、掃拖一體、導航等高能設計,不僅彌補了用戶體驗上的不足,更是完全碾壓石頭、科沃斯等產品。 究...
本文來源SemiWiki據報道,英特爾將把NAND業務出售給SK Hynix。這可能會讓英特爾走出一個艱難而分散注意力的市場。人們不禁懷疑英特爾要放棄中國嗎?就好像英特爾把XPoint賣給了Micron那樣離開NAND非常有意義內存市場非常艱難,競爭激烈,最糟糕的是,它的周期性很強。除非你有一個良好心態,否則內存需求和定價的起伏可能非常難看。三星是這一行業超級霸...
示波器是利用電子示波管的特性,將人眼無法直接觀測的交變電信號轉換成圖像,顯示在熒光屏上以便測量的電子測量儀器,而想要獲得較為真實的測量結果。示波器探頭價格并不是固定不變的,就用其種類來說,示波器探頭分為高壓探頭,差分探頭有源高速探頭等,不同種類的示波器探頭價格也從幾百元到上萬元,要說示波器探頭價格的主要決定因素當然是帶寬和功能。...

史海拾趣

問答坊 | AI 解惑

智能機器車

智能機器車方案一、目的 設計一輛小車,能夠實現自主循線、避障的主要功能。 二、小車的驅動模式 該車采用了一個電動機驅動兩個后輪,一個電動機驅動兩個前輪轉向的模式。利用單片機的P1.0口、P1.1口、P1.2口、P1.3口對電機通過脈寬調控電路進行 ...…

查看全部問答∨

有關于AT24C02掉電存儲

是不是AT24C02直接接到主器件上就可以工作了,需要編程嗎,要的話怎么編 接線圖如下, [ 本帖最后由 zxbwewe 于 2009-4-20 13:48 編輯 ]…

查看全部問答∨

AVR一本很好的參考書,有很多源程序!

本帖最后由 paulhyde 于 2014-9-15 09:09 編輯 如題!共享一本參考電子書!  …

查看全部問答∨

共享一個大賽例子

這是我在網上找到的一個不錯的例子 ,對以后可能會有幫助 。大家一起共享一下…

查看全部問答∨

求燒寫ARM9 2440比較簡單、經濟的方法!

芯片是三星s3c2440的,目前有開發板一塊,電腦系統是XP,無串口,無并口,只有USB。 我想把PB生成wince系統的nk.bin燒到板子上去。求個比較簡單、經濟的方法。…

查看全部問答∨

信號不穩定求助

我用74HC4051做了一個開關選擇電路, 另外用74HC4051和74HC4053做了一塊,單獨調試時有時信號能調通,有時調不通信號很不穩定,不知道怎么回事 兩個板子連起來也調通過,可是也是不穩定,一會通了,一會又不通了 不知道怎么回事? 信號不穩定是 ...…

查看全部問答∨

[疑問]GPRS上網,卻沒有用到ATD*99***1#

一直以來接觸到的資料都是這么講的:在配置完GPRS模塊之后,要向模塊發送一個ATD*99***1#指令,完成與移動的GGSN的連接。 可是最近拿到了一個程序,是SIM300上網的,它的上網大致流程是這樣的: 1.配置SIM300模塊 2.通過AT+CIPSTART指定IP,建立T ...…

查看全部問答∨

怎樣修改apb的頻率

我用的是cortex m0的lpc1114,發現最短的時鐘中斷太長了,于是想修改一個apb的clk,但是找不到此寄存器 看到有的手冊說是apb的頻率是ahb的四分之一,請問一下該如何修改,謝謝了…

查看全部問答∨

[求購]EK_LM3S8962 和 VS1053模塊

本帖最后由 ddllxxrr 于 2016-1-7 16:58 編輯 誰有多余的啊 仍給我吧 非常感謝!   舍不得賣的話,借我玩幾天也行啊! EK_LM3S8962需要帶LMS2110小板, 本站強薦:185娛樂T城.足球T真_人.彩票齊全T手機可投T注任何游戲. 首次開 ...…

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

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 蒙阴县| 吴忠市| 略阳县| 丰镇市| 集贤县| 雅安市| 金堂县| 余姚市| 洪洞县| 特克斯县| 东阿县| 阳谷县| 康马县| 清新县| 宁城县| 田阳县| 宝鸡市| 融水| 于都县| 上林县| 静宁县| 邮箱| 深州市| 黑河市| 肇东市| 大石桥市| 江西省| 乌兰县| 瑞金市| 建德市| 博白县| 盐津县| 会泽县| 康马县| 南江县| 修武县| 偃师市| 兴国县| 西盟| 囊谦县| 祁阳县|