四 使用说明
4.1 移植修改
移植修改都在H文件中的移植修改部分。下面进行具体说明。
//----------------------------------------------------------------------------//
// 编号:1
// 名称:
// 功能:单片机寄存器头文件,例如reg51.h
//----------------------------------------------------------------------------//
#include "ATT703x.H"
4.1.1
这部分是请您把使用的单片机的头文件包含进来。大虾们用过MCU多了,知道不同的MCU,其寄存器定义是不一样滴,不是所有的51单片机都用Reg51.H或Reg52.H头文件的。
//----------------------------------------------------------------------------//
// 编号:2
// 名称:SDA, SCL
// 功能:模拟I2C数据传送位
//----------------------------------------------------------------------------//
#if defined(IIC_IO_ENABLE)
sbit SDA = P0^0; // 模拟I2C数据传送位。
sbit SCL = P2^6; // 模拟I2C时钟控制位。
#endif
4.1.2
SDA和SCL口线定义。这里就是您用的口线,如果您告诉我您不知道怎么改,好吧,你赢了……
//----------------------------------------------------------------------------//
// 编号:3
// 名称:IIC_Delay_1US()
// 功能:精确的1微秒延时函数。请根据您所用的单片机来正确设置。
// :如果您的系统中有精确的微妙级延时函数,那么您可以直接使用。
// :例如,您的延时函数是Delay_1us(),那么您可以使用下句
// :#defineIIC_Delay_1us() Delay_1us()
// :来实现延时。
//----------------------------------------------------------------------------//
#defineIIC_Delay_500ns() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
#define IIC_Delay_1US() IIC_Delay_500ns();IIC_Delay_500ns();
4.1.3软件延时函数,这里是标准IIC,不是快速IIC。1us的延时怎么做呢?当然是nop函数了。如果您不知道一个nop的执行时间,那么说明您需要好好看看手册了。
4.1.4
好多单片机都需要设置时钟,设置GPIO状态,所以在使用IIC之前,请一定确保MCU先初始化完毕。
4.2 函数说明
4.2.1 MCU向IIC器件发送多字节数据函数
//----------------------------------------------------------------------------//
// MCU向IIC器件发送多字节数据函数(对外提供服务)
//函数名称:IIC_MCU_Send_Str
//函数功能:MCU向IIC从器件发送多字节数据。本函数是写IIC从器件的抽象函数。
//入口参数:
// *PAddr: IIC地址以及子地址。PAddr[0]中存放IIC地址,后面的存放子地址。
// AddrNum : IIC以及子地址的字节数。不可为0.
//
// *PDataAddr: 第2批发送的数据的首地址。这部分是发送的数据。
// DataNum :
第2批要发送的字节数(最大为65536个字节)。为0时不发送这一部分。
//出口参数:0 = 操作成功,1 = 操作出错。
//重要说明:这是一个从启动IIC总线到发送数据再到最后结束总线为止的完整的发送过程。
// 数据发送的顺序是先发送PAddr[0],最后发送PAddr[AddrNum - 1],然后发送
// PDataAddr[0],最后发送PDataAddr[DataNum - 1]。
// 一般地,PAddr用于发送器件IIC地址和子地址,PDataAddr用于发送数据。
// 本函数对有无子地址的IIC器件都适用。
//----------------------------------------------------------------------------//
extern uint8 IIC_MCU_Send_Str(uint8 *PAddr,uint8 AddrNum, uint8 *PDataAddr, uint16 DataNum)
应用示例:
从0x00字节地址开始写AT24C02,写入10个字节数(这里不考虑页写等待,因为和IIC写无关),这10B数据存放在unsigned char Buf[10]中,写入时要求Buf[0]写入0x00字节地址,Buf[1]写入0x01字节地址……。
A2、A1、A0全接地。(有人说我没说明WP的接法……我只有一个问题,你是来砸场子的么!!!)
首先组织IIC地址,设置一数组unsigned char Addr[2],其中Addr[0] = 0xA0,Addr[1] = 0x00;
Addr [0]中存放的是(二进制表示) 1 0 1 0 A2 A1 A0 0(LSB)
Addr [1]中存放的是(二进制表示) a7 a6 a5 a4 a3 a2 a1 a0(LSB)
调用时 IIC_MCU_Send_Str(Addr,2, Buf, 10);
您还应当查看一下函数的返回值,是0表示操作成功,否则操作失败。
4.2.1 MCU从有子地址的IIC器件中接收多字节函数
//----------------------------------------------------------------------------//
// MCU从有子地址的IIC器件中接收多字节函数(对外接口)
//函数名称:IICMCURcvStr
//函数功能:本函数用于有子地址的IIC器件的读操作。
//入口参数:
// *PAddr: IIC地址以及子地址。PAddr[0]中存放IIC地址,后面的存放子地址。
// AddrNum : IIC以及子地址的字节数。为0时出错.
// *PDataAddr:存放所接收数据的首地址
// DataNum :
要接收的字节数。合法值1-65535。为0时出错。
//
//出口参数:0 = 操作成功,1 = 操作出错。
//重要说明:
// 读取的第一个数据存放在PDataAddr[0]中,第一个存放在PDataAddr[1]中……
// 有子地址的IIC器件的读操作是:
// MCU先启动总线,然后发送器件的IIC地址和需要操作的子地址
//(这一部分就是*PAddr),之后重新启动总线,再次发送器件的IIC地址且最低位置1以表明是读
// 操作,等待应答后便开始接收数据(这一部分是*PDataAddr),最后关闭总线。
//----------------------------------------------------------------------------//
extern uint8 IIC_MCU_Rcv_Str(uint8 *PAddr,uint8 AddrNum, uint8 *PDataAddr, uint16DataNum)
读取的第一个数据存放在PDataAddr[0]中,第一个存放在PDataAddr[1]中……
应用示例:
从0x00字节地址开始读AT24C02,读10个字节数并且存放在unsignedchar Buf[10]中,
A2、A1、A0全接地。(有人说我没说明WP的接法……还提这个问题!!)
首先组织IIC地址,设置一数组unsigned char Addr[2],其中Addr[0] = 0xA0,Addr[1] = 0x00;
Addr [0]中存放的是(二进制表示) 1 0 1 0 A2 A1 A0 0(LSB)
Addr [1]中存放的是(二进制表示) a7 a6 a5 a4 a3 a2 a1 a0(LSB)
调用时 IIC_MCU_Rcv_Str(Addr, 2, Buf, 10);
这样,Buf[0]是读取到的0x00字节地址的数据,Buf[1]是0x01字节地址的数据……
您还应当查看一下函数的返回值,是0表示操作成功,否则操作失败。
五 最后的废话
好吧,有人会说这个实现的有点罗嗦,不如直接以IIC地址,寄存器地址做参数来的方便;虽然有时候我也这么觉得。
但是、但是、但是什么呢?下期见!
|