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
}
}
以下实例显示了怎样利用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
}
}
集成电路 电路 C语言 嵌入式 Maxim 总线 LED ADC 相关文章:
- 基于MSP430单片机的多路数据采集系统的设计(06-20)
- LED照明全方位渗透,高能效驱动方案点亮前景(11-17)
- 使用L6506 实现步进电机的电流控制(12-10)
- 激光微加工系统及基于DSP+FPGA的控制单元的研究(03-05)
- Si472x射频收发芯片的交通状况提示装置(02-18)
- 红外方式数字图像采集报警系统的设计(03-15)