色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MAXQ2000微控制器軟件I2C驅(qū)動(dòng)

          MAXQ2000微控制器軟件I2C驅(qū)動(dòng)

          ——
          作者: 時(shí)間:2007-01-26 來源:《Maxim公司》 收藏
           注釋:表1中的最后3個(gè)格式顯示了i2csend()怎樣向i2c總線上的同一個(gè)器件連續(xù)發(fā)送數(shù)據(jù)。

          如果尋址器件每一字節(jié)作出應(yīng)答,i2csend()函數(shù)返回一個(gè)等于i2c_xmit_ok的數(shù)值(無符號(hào)字符類型),如果尋址器件每字節(jié)沒有應(yīng)答,返回值則等于i2c_xmit_failed。當(dāng)一個(gè)字節(jié)沒有得到應(yīng)答時(shí),函數(shù)將立即返回。

          i2crecv()
          該函數(shù)使maxq2000能夠使用軟件i2c驅(qū)動(dòng)從器件接收數(shù)據(jù)。i2crecv()函數(shù)需要以下4個(gè)參數(shù)(均為全局變量)來初始化:

          i2cdata (無符號(hào)字符 *):存儲(chǔ)接收數(shù)據(jù)陣列的第一個(gè)字節(jié)指針。
          i2cdatalen (無符號(hào)整數(shù)):從i2c總線上接收到的字節(jié)數(shù)(不包括器件地址)。
          i2cdataaddr (無符號(hào)字符):將要接收數(shù)據(jù)的器件地址。注意,如果該變量設(shè)置為0,將不發(fā)送地址,接收i2c數(shù)據(jù)。

          i2cdataterm (無符號(hào)字符):i2c傳送如何結(jié)束。調(diào)用i2crecv(): i2c_term_none、 i2c_term_ack或者i2c_term_nack_and_stop時(shí),該變量可以取三個(gè)值。
          在i2c總線上從器件接收數(shù)據(jù)的格式取決于4個(gè)全局變量的取值。表2列出了這些全局變量不同取值時(shí)的i2c命令格式。
          表2. 禁用時(shí)鐘擴(kuò)展,i2crecv()發(fā)送的i2c命令

          注釋:表2中的最后3個(gè)格式顯示了i2crecv()怎樣從i2c總線上的同一個(gè)器件連續(xù)接收數(shù)據(jù)。

          如果地址作為i2c命令的一部分進(jìn)行發(fā)送,沒有得到應(yīng)答,i2crecv()函數(shù)返回一個(gè)等于i2c_xmit_failed的數(shù)值(無符號(hào)字符),否則,返回i2c_xmit_ok。


          帶有時(shí)鐘擴(kuò)展的maxqi2c庫使用實(shí)例
          以下實(shí)例顯示了怎樣利用maxqi2c庫從max1169 adc接收16位采樣,由maxq的rs-232端口,將這些數(shù)據(jù)傳送至pc。
          原理
          采用max1169 adc評(píng)估板和maxq2000評(píng)估板(rev b)實(shí)現(xiàn)了該實(shí)例。圖1顯示了兩塊評(píng)估板的連接。maxq2000 i/o端口的引腳0和引腳1 (分別在j2-30和j2-28)用作i2c總線上的主機(jī)sda和scl線。


          圖1.max1169評(píng)估板和maxq2000評(píng)估板(rev b)連接原理圖,將由maxqi2c庫使用

          注釋:maxq2000評(píng)估板上的maxq2000高頻晶振(y1)以20mhz晶振替代。max1169評(píng)估板的跳接器設(shè)置和maxq2000評(píng)估板的開關(guān)設(shè)置在表3和表4中:

          表3:max1169評(píng)估板的跳接器設(shè)置

          表4. maxq2000評(píng)估板(rev b)開關(guān)設(shè)置 "

          固件
          該實(shí)例(max1169.c)的固件文件在附錄a中給出。完整的工程資料可以在maxim maxq2000網(wǎng)頁下載,采用maxq iar嵌入式平臺(tái)編譯。該實(shí)例中,maxqi2c庫的用戶定義代碼(在maxqi2c.h文件的開始)與清單1的源代碼完全相同。

          max1169.c文件包括兩個(gè)頭文件:iomaxq200x.h和maxqi2c.h。注意,實(shí)例中的iomaxq200x.h文件將忽略maxq包含路徑iar嵌入式平臺(tái)中的iomaxq200x.h文件。iomaxq200x.h文件為maxqi2c庫所需的每個(gè)端口引腳進(jìn)行定義。包含了maxqi2c.h文件,以支持固件調(diào)用maxqi2c庫函數(shù)。

          固件分成5步,在max1169.c文件中標(biāo)出(參見附錄a)。

          第1步初始化uart0,以19200bps進(jìn)行異步通信。注意,如果maxq2000系統(tǒng)時(shí)鐘不是20mhz,必須修改寄存器pr0的分配以獲得所需的波特率。

          第2步調(diào)用i2cinit()函數(shù),以初始化i2c總線maxq2000所使用的引腳。

          第3步初始化參數(shù),調(diào)用i2crecv()函數(shù)。參數(shù)經(jīng)過初始化,按照下面的格式傳送i2c命令:


          [s] [addr] [r] [a] [clock stretch] [data0] [a] [data1] [a (termination)]
          第4步將地址參數(shù)設(shè)置為0。使i2crecv()函數(shù)按照下面的格式傳送i2c命令:

          [clock stretch] [data0] [a] [data1] [a (termination)]
          第5步是周期不確定的循環(huán)。該循環(huán)調(diào)用i2crecv() (按照第4步定義的格式),從max1169接收一個(gè)16位采樣。由uart0將該16位采樣傳送(msb在前)至pc。由于匹配參數(shù)i2cdataterm總是等于i2c_term_ack,循環(huán)的周期不確定,max1169不會(huì)看到停止?fàn)顟B(tài)。
          附錄a: max1169.c

          /*
          * demo of maxqi2c software i2c driver
          * (uses evkits for the max1169 and maxq2000)
          *
          * by: paul holden - maxim integrated products
          *
          *
          * desc: test program for the maxqi2c.c/maxqi2c.h i2c
          * driver for the maxq2000. the program reads
          * 16-bit samples from the max1169 (running in
          * continuous conversion mode) and transmits them
          * using the uart0 port.
          *
          * note - the following code assumes the maxq2000 has
          * a fsysclk=20mhz.
          */

          #include "iomaxq200x.h"
          #include "maxqi2c.h"

          void main()
          {
          unsigned char data[2];

          // 1. init uart0
          pd7_bit.bit0 = 1; // set tx0 pin as output
          scon0 = 0x42;
          smd0 = 0x02;
          pr0 = 0x07dd; // 19200bps

          // 2. init bit-banged i2c port
          i2cinit();

          // 3. send initial i2c request
          // [s] [addr+r] [a] [clock_stretch] [data0] [a] [data1] [a (termination)]
          i2cdata = (unsigned char *)(&data); // cast needed!
          i2cdataaddr = 0x7e;
          i2cdatalen = 0x0002;
          i2cdataterm = i2c_term_ack;
          i2crecv();

          // 4. init continuous conversion
          // [clock_stretch] [data0] [a] [data1] [a (termination)]
          i2cdataaddr = 0x00;

          // 5. receive a 16-bit sample and transfer it to the uart0 port
          // one byte at a time. repeat forever...
          while (1)
          {
          i2crecv();

          while(!scon0_bit.ti); // wait for uart0 buffer to be empty
          scon0_bit.ti = 0; // reset ti flag
          sbuf0 = data[0]; // send data byte 0
          while(!scon0_bit.ti); // wait for uart0 buffer to be empty
          scon0_bit.ti = 0; // reset ti flag
          sbuf0 = data[1]; // send data byte 1
          }
          }

           


          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉