MAXQ2000微控制器軟件I2C驅(qū)動(dòng)
如果尋址器件每一字節(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
}
}
評(píng)論