微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 工业电子 > MAXQ2000微控制器软件I2C驱动

MAXQ2000微控制器软件I2C驱动

时间:09-02 来源:互联网 点击:
带有时钟扩展的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中:




固件

该实例(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 fo

r 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;

// 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; // Send data byte 1
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top