测试代码:
//CAT1161测试
{
extern int rand();
uint ui_Test1;
uchar uc_Test2;
uchar uc_Test3;
ui_Test1 = 0;
//循环
while (1)
{
uc_Test2 = rand();
//CAT1161写操作
{
g_CAT1161_Write(ui_Test1, uc_Test2); //CAT1161写操作
//正常写入
if (gb_Slave_Busy == 0)
acc ++ ; //断点测试
//写入失败
else
{
acc ++ ; //断点测试
continue;
} //写入失败
} //CAT1161写操作
//CAT1161读操作
{
uc_Test3 = guc_CAT1161_Read(ui_Test1); //CAT1161读操作
//正常读出
if (gb_Slave_Busy == 0)
{
//读出匹配
if (uc_Test2 == uc_Test3)
acc ++;
//读出错误
else
{
acc ++ ; //断点测试
continue;
} //读出错误
} //正常读出
//读出失败
else
{
acc ++ ; //断点测试
continue;
} //读出失败
} //CAT1161读操作
ui_Test1 ++;
ui_Test1 &=0x07ff;
if (ui_Test1 == 0)
acc ++ ; //断点测试
} //循环
} //CAT1161测试
I2C驱动模块
//##################################################################
//I2C总线起始位
//入口;
//出口:
//通讯池:
//功能:
//用法:
void I2cBus_Start(void) reentrant //I2C总线起始位
{
gb_Slave_Busy = 0; //从器件忙标志 复位
io_SDA = 1;
DELAY_50ns; //延时0.05us
io_SCL = 1;
DELAY_600ns; //延时0.6us
io_SDA = 0;
DELAY_600ns; //延时0.6us
io_SCL = 0;
DELAY_1200ns; //延时1.2us
} //I2C总线起始位
//##################################################################
//I2C总线终止位
//入口;
//出口:
//通讯池:
//功能:
//用法:
void I2cBus_Stop(void) reentrant //I2C总线终止位
{
io_SCL = 0;
DELAY_1200ns; //延时1.2us
io_SDA = 0;
DELAY_50ns; //延时0.05us
io_SCL = 1;
DELAY_600ns; //延时0.6us
io_SDA = 1;
DELAY_600ns; //延时0.6us
} //I2C总线终止位
//##################################################################
//I2C总线应答符
//入口; b_Ack = 0 有效应答
//出口:
//通讯池:
//功能:
//用法:
void I2cBus_Ack(void) reentrant //I2C总线应答符
{
io_SCL = 1;
DELAY_600ns; //延时0.6us
io_SCL = 0;
DELAY_1200ns; //延时1.2us
} //I2C总线应答符
//##################################################################
//I2C总线写入字符
//入口; uc_Data 须写入的8位字节
//出口: 收到应答符, 返回0; 未收到应答符, 返回1
//通讯池:
//功能: 将字符写入从器件, 然后接受应答
//用法:
void I2cBus_CharWr(uchar uc_Data) reentrant //I2C总线写入字符
{
uchar uc1;
//写入8个字节
for (uc1 = 0; uc1 < 8; uc1 ++ )
{
io_SDA = uc_Data & 0x80;
DELAY_50ns; //延时0.05us
io_SCL = 1;
uc_Data <<= 1;
DELAY_600ns; //延时0.6us
io_SCL = 0;
DELAY_1200ns; //延时1.2us
} //写入8个字节
io_SDA = 1;
io_SCL = 1;
DELAY_600ns; //延时0.6us
gb_Slave_Busy = io_SDA; //从器件忙标志 读应答符
io_SCL = 0;
DELAY_1200ns; //延时1.2us
} //I2C总线写入字符
//##################################################################
//I2C总线读出字符
//入口; uc_Data 须读出的8位字节
//出口:
//通讯池:
//功能: 向从器件读取数据
//用法:
uchar uc_I2cBus_CharRd(void) reentrant //I2C总线读出字符
{
uchar uc1, uc2;
io_SDA = 1;
//读出8个字节
for (uc1 = 0; uc1 < 8; uc1 ++ )
{
uc2 <<= 1;
io_SCL = 1;
//读入一位
if (io_SDA == 1)
uc2 ++;
io_SCL = 0;
DELAY_1200ns; //延时1.2us
} //读出8个字节
return (uc2);
} //I2C总线读出字符
//##################################################################
//CAT1161看门狗
//入口; 对应的寄存器数据
//出口:
//通讯池:
//功能:
//用法:
void g_CAT1161_WatchDog(void) reentrant //CAT1161看门狗
{
io_SCL = 0;
io_SDA = 0;
DELAY_50ns; //延时0.05us
DELAY_600ns; //延时0.6us
io_SDA = 1;
} //CAT1161看门狗
//##################################################################
//CAT1161读操作
//入口; ui_Adr 扇区地址
//出口: 读出的数据
//通讯池:
//功能: 读出一个数据
//用法:
uchar guc_CAT1161_Read(uint ui_Adr) reentrant //CAT1161读操作
{
uchar uc1, uc2;
//读操作
// 操作时间限制在10ms
for (uc1 = 0; uc1 < 250; uc1 ++)
{
//起始位
I2cBus_Start(); //I2C总线起始位
//I2C总线写入字符
// 寻址码写操作 高位地址
I2cBus_CharWr(b10100000 + ( ( * ( (uchar * ) & ui_Adr + 0) & b00000111) << 1) ); //I2C总线写入字符
//从器件忙 操作失败
if (gb_Slave_Busy == 1)
continue;
//低位地址
I2cBus_CharWr( * ( (uchar * ) & ui_Adr + 1) ); //I2C总线写入字符
//从器件忙 操作失败
if (gb_Slave_Busy == 1)
continue;
//重新起始位
I2cBus_Start(); //I2C总线起始位
//CAT1161寻址
I2cBus_CharWr(b10100001); //I2C总线写入字符
//从器件忙 操作失败
if (gb_Slave_Busy == 1)
continue;
//读出指定数据
uc2 = uc_I2cBus_CharRd(); //I2C总线读出字符
//不作应答
io_SDA = 1;
DELAY_50ns; //延时0.05us
I2cBus_Ack(); //I2C总线应答符
I2cBus_Stop(); //I2C总线终止位
break;
} //读操作
return (uc2);
} //CAT1161读操作
//##################################################################
//CAT1161写操作
//入口; ui_Adr 地址
// ucp_Data 需写入的数据
//出口:
//通讯池:
//功能: 写入一个数据
//用法:
void g_CAT1161_Write(uint ui_Adr, uchar uc_Data) reentrant //CAT1161写操作
{
uchar uc1;
//扇区写操作
// 操作时间限制在10ms
for (uc1 = 0; uc1 < 250; uc1 ++)
{
//起始位
I2cBus_Start(); //I2C总线起始位
//I2C总线写入字符
// 寻址码写操作 高位地址
I2cBus_CharWr(b10100000 + ( ( * ( (uchar * ) & ui_Adr + 0) & b00000111) << 1) ); //I2C总线写入字符
//从器件忙 操作失败
if (gb_Slave_Busy == 1)
continue;
//存储低位地址
I2cBus_CharWr( * ( (uchar * ) & ui_Adr + 1) ); //I2C总线写入字符
//从器件忙 操作失败
if (gb_Slave_Busy == 1)
continue;
I2cBus_CharWr(uc_Data); //I2C总线写入字符
//从器件忙 操作失败
if (gb_Slave_Busy == 1)
continue;
I2cBus_Stop(); //I2C总线终止位
break;
} //扇区写操作
} //CAT1161写操作
|