📄 cat1161.c.bak
字号:
/****************************************************************************/
/* */
/* Copyright (c) 2005, 老树工作室 */
/* All rights reserved. */
/* */
/* http://www.saintone.net Email:hxm0902@163.com */
/* QQ:112431149 Tel:010-62966630 */
/* */
/****************************************************************************/
/****************************************************************************/
/* 文件名:cat1161.c */
/* 版 本:Version 1.0 */
/* 描 述:cat1161的eeprom读写试验代码 */
/* 作 者:spot */
/* 函 数: */
/* iic_wait */
/* iic_start */
/* iic_stop */
/* iic_ack */
/* iic_no_ack */
/* iic_wait_ack */
/* iic_send_byte */
/* iic_receive_byte */
/* */
/* 历史记录: */
/* spot 2005-06-20 Creat Inital version. (Version 1.0) */
/****************************************************************************/
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include "../includes/types.h"
sbit SDA = P0^5; /* iic数据传送位 */
sbit SCL = P0^4; /* iic时钟控制位 */
/* 函数声明 */
void iic_wait(void); /* iic延时 */
void iic_start(void); /* 开启iic总线 */
void iic_stop(void); /* 关闭iic总线 */
void iic_ack(void); /* 发送ACK信号 */
void iic_no_ack(void); /* 发送NOACK信号 */
bit iic_wait_ack(void); /* 等待ACK信号 */
void iic_send_byte(u_char demand); /* MCU向iic设备发送一个字节 */
u_char iic_receive_byte(void); /* MCU从iic设备接收一个字节 */
void write_iic_data(u_char write_data[], u_char address, u_char num); /* 向iic设备写入N个字节 */
void read_iic_data(u_char read_data[], u_char address, u_char num); /* 从iic设备读取N个字节 */
/* 声明结束 */
/* iic延时 */
void iic_wait(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/* 开启iic总线 */
void iic_start(void)
{
SDA = 1;
SCL = 1;
iic_wait();
SDA = 0;
iic_wait();
SCL = 0;
}
/* 关闭iic总线 */
void iic_stop(void)
{
SDA=0;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
SDA=1;
}
/* 发送ACK信号 */
void iic_ack(void)
{
SDA=0;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/* 发送NOACK信号 */
void iic_no_ack(void)
{
SDA=1;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/****************************************************************************/
/* 函数名:iic_wait_ack */
/* 功 能:等待ACK信号 */
/* 作 者:spot */
/* 输 入:无 */
/* 输 出:1-ACK 0-ERROR */
/* */
/* 历史记录: */
/* spot 2005-06-20 Creat Inital version. (Version 1.0) */
/****************************************************************************/
bit iic_wait_ack(void)
{
u_char errtime=255;
SDA=1;
iic_wait();
SCL=1;
iic_wait();
while(SDA)
{
errtime--;
if(!errtime)
return 0;
}
SCL=0;
return 1;
}
/****************************************************************************/
/* 函数名:iic_send_byte */
/* 功 能:MCU向iic设备发送一个字节 */
/* 作 者:spot */
/* 输 入: */
/* sbyte 待发送的字节数据 */
/* */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-20 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void iic_send_byte(u_char sbyte)
{
u_char i = 8;
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(sbyte&0x80);
sbyte <<= 1;
iic_wait();
SCL = 1;
iic_wait();
}
SCL=0;
}
/****************************************************************************/
/* 函数名:iic_receive_byte */
/* 功 能:MCU从iic设备接收一个字节 */
/* 作 者:spot */
/* 输 入:无 */
/* 输 出:ddata 接收数据 */
/* */
/* 历史记录: */
/* spot 2005-06-20 Creat Inital version. (Version 1.0) */
/****************************************************************************/
u_char iic_receive_byte(void)
{
u_char i=8;
u_char ddata=0;
SDA=1;
while(i--)
{
ddata <<= 1;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
ddata |= SDA;
}
SCL=0;
return ddata;
}
/****************************************************************************/
/* 函数名:write_iic_data */
/* 功 能:向iic设备写入N个字节 */
/* 作 者:spot */
/* 输 入: */
/* write_data 存放写入字节的数组 */
/* address 指定从address处开始写入 */
/* num 写入的字节数 */
/* */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-20 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void write_iic_data(u_char write_data[], u_char address, u_char num)
{
u_char n;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address);
iic_wait_ack();
for(n=0; n<num; n++)
{
iic_send_byte(write_data[n]);
iic_wait_ack();
}
iic_stop();
}
/****************************************************************************/
/* 函数名:read_iic_data */
/* 功 能:从iic设备读取N个字节 */
/* 作 者:spot */
/* 输 入: */
/* read_data 存放读取字节的数组 */
/* address 指定从address处开始读取 */
/* num 读取的字节数 */
/* */
/* 输 出:无 */
/* */
/* 历史记录: */
/* spot 2005-06-20 Creat Inital version. (Version 1.0) */
/****************************************************************************/
void read_iic_data(u_char read_data[], u_char address, u_char num)
{
u_char n;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address);
iic_wait_ack();
iic_start();
iic_send_byte(0xa1);
iic_wait_ack();
for (n=0; n<num; n++)
{
read_data[n] = iic_receive_byte();
if (n != (num - 1)) /* 最后一个数据不应答 */
{
iic_ack();
}
}
iic_no_ack();
iic_stop();
}
main()
{
u_char test_write[16];
u_char test_read[16];
u_int i;
/* 单步调试,可以观看写入数据与读出数据结果 */
while(1)
{
for (i=0; i<16; i++)
{
test_read[i] = 0;
test_write[i] = i;
}
write_iic_data(test_write, 0, 16);
read_iic_data(test_read, 0, 16);
for (i=0; i<16; i++)
{
test_write[i] = i + 16;
test_read[i] = 0;
}
write_iic_data(test_write, 16, 16);
read_iic_data(test_read, 16, 16);
read_iic_data(test_read, 0, 16);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -