新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > MAXQ2000微控制器软件I2C驱动

MAXQ2000微控制器软件I2C驱动

——
作者:时间:2007-01-26来源:《Maxim公司》收藏
 注释:表1中的最后3个格式显示了i2csend()怎样向i2c总线上的同一个器件连续发送数据。

如果寻址器件每一字节作出应答,i2csend()函数返回一个等于i2c_xmit_ok的数值(无符号字符类型),如果寻址器件每字节没有应答,返回值则等于i2c_xmit_failed。当一个字节没有得到应答时,函数将立即返回。

i2crecv()
该函数使maxq2000能够使用软件i2c驱动从器件接收数据。i2crecv()函数需要以下4个参数(均为全局变量)来初始化:

i2cdata (无符号字符 *):存储接收数据阵列的第一个字节指针。
i2cdatalen (无符号整数):从i2c总线上接收到的字节数(不包括器件地址)。
i2cdataaddr (无符号字符):将要接收数据的器件地址。注意,如果该变量设置为0,将不发送地址,接收i2c数据。

i2cdataterm (无符号字符):i2c传送如何结束。调用i2crecv(): i2c_term_none、 i2c_term_ack或者i2c_term_nack_and_stop时,该变量可以取三个值。
在i2c总线上从器件接收数据的格式取决于4个全局变量的取值。表2列出了这些全局变量不同取值时的i2c命令格式。
表2. 禁用时钟扩展,i2crecv()发送的i2c命令

注释:表2中的最后3个格式显示了i2crecv()怎样从i2c总线上的同一个器件连续接收数据。

如果地址作为i2c命令的一部分进行发送,没有得到应答,i2crecv()函数返回一个等于i2c_xmit_failed的数值(无符号字符),否则,返回i2c_xmit_ok。


带有时钟扩展的maxqi2c库使用实例
以下实例显示了怎样利用maxqi2c库从max1169 adc接收16位采样,由maxq的rs-232端口,将这些数据传送至pc。
原理
采用max1169 adc评估板和maxq2000评估板(rev b)实现了该实例。图1显示了两块评估板的连接。maxq2000 i/o端口的引脚0和引脚1 (分别在j2-30和j2-28)用作i2c总线上的主机sda和scl线。


图1.max1169评估板和maxq2000评估板(rev b)连接原理图,将由maxqi2c库使用

注释:maxq2000评估板上的maxq2000高频晶振(y1)以20mhz晶振替代。max1169评估板的跳接器设置和maxq2000评估板的开关设置在表3和表4中:

表3:max1169评估板的跳接器设置

表4. maxq2000评估板(rev b)开关设置 "

固件
该实例(max1169.c)的固件文件在附录a中给出。完整的工程资料可以在maxim maxq2000网页下载,采用maxq iar嵌入式平台编译。该实例中,maxqi2c库的用户定义代码(在maxqi2c.h文件的开始)与清单1的源代码完全相同。

max1169.c文件包括两个头文件:iomaxq200x.h和maxqi2c.h。注意,实例中的iomaxq200x.h文件将忽略maxq包含路径iar嵌入式平台中的iomaxq200x.h文件。iomaxq200x.h文件为maxqi2c库所需的每个端口引脚进行定义。包含了maxqi2c.h文件,以支持固件调用maxqi2c库函数。

固件分成5步,在max1169.c文件中标出(参见附录a)。

第1步初始化uart0,以19200bps进行异步通信。注意,如果maxq2000系统时钟不是20mhz,必须修改寄存器pr0的分配以获得所需的波特率。

第2步调用i2cinit()函数,以初始化i2c总线maxq2000所使用的引脚。

第3步初始化参数,调用i2crecv()函数。参数经过初始化,按照下面的格式传送i2c命令:


[s] [addr] [r] [a] [clock stretch] [data0] [a] [data1] [a (termination)]
第4步将地址参数设置为0。使i2crecv()函数按照下面的格式传送i2c命令:

[clock stretch] [data0] [a] [data1] [a (termination)]
第5步是周期不确定的循环。该循环调用i2crecv() (按照第4步定义的格式),从max1169接收一个16位采样。由uart0将该16位采样传送(msb在前)至pc。由于匹配参数i2cdataterm总是等于i2c_term_ack,循环的周期不确定,max1169不会看到停止状态。
附录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
}
}

 


关键词:

评论


相关推荐

技术专区

关闭