📄 i2_bus.c
字号:
#include "m1101.h"
/************************************************
函数名称:delay(uchar time)
函数功能: 10ms延时函数
应用范围: 只在本文件中使用,内部函数
入口参数: uchar time
出口参数: 无
*************************************************/
void delay(uchar time)
{
uchar i,j;
for(i=100;i>0;i--)
{
for(j=time;j>0;j--)
{
_nop_();
}
}
}
/************************************************
函数名称:Start_iic(void)
函数功能:启动IIC总线
应用范围:局部函数,只在本文件中使用
入口参数: 无
出口参数: 无
*************************************************/
void Start_iic(void)
{
scl=1;
sda=1; //开始信号,当SCL=1;SDA由高变为低时候,开始信号
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ (); //建立开始信号时间
sda=0; //发出开始信号
_nop_ ();
_nop_ (); //总线保持时间
_nop_ ();
_nop_ ();
scl=0; //释放总线 ,一定注意SCL=0
_nop_();
_nop_();
}
/************************************************
函数名称:void Stop_iic(void)
函数功能:挂起IIC总线
应用范围:局部函数,只在本文件中使用
入口参数: 无
出口参数: 无
*************************************************/
void Stop_iic(void)
{
scl=1;
sda=0; //开始信号,当SCL=1;SDA由低变为高时候,开始信号
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ (); //建立停止信号时间
sda=1; //发出停止信号
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
scl=0; //钳住总线
_nop_();
_nop_();
}
/************************************************
函数名称:Ack(bit)
函数功能:应答函数,功能是主控制器进行应答信号(可以是应答或是非应答信号)
当数据从E2ROM中被送出或者发送到E2ROM中,在低9个周期送出一个0;
已确认他送接受每个字
应用范围:全局函数
入口参数: 无
出口参数: 无
*************************************************/
void Ack(bit a)
{
if(a) sda=1;
else sda=0;
_nop_();
_nop_();
scl = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl = 0;
_nop_();
_nop_();
}
/************************************************
函数名称:Read_byte()
函数功能:读取总线上一个数据
应用范围:全局函数
入口参数: 无
出口参数: uchar rom_data
*************************************************/
uchar Read_byte(void)
{
uchar i,rom_data=0;
sda=1;
for(i=0;i<8;i++)
{
scl=1;
_nop_ ();
_nop_ ();
rom_data<<=1;
if(sda)rom_data=rom_data+1;
else rom_data=rom_data;
scl=0;
_nop_ ();
_nop_ ();
}
return (rom_data);
}
/************************************************
函数名称:Write_byte(uchar byte)
函数功能:往总线上写入数据
应用范围:全局函数
入口参数: uchar byte
出口参数: 无
*************************************************/
void Write_byte(uchar byte)
{
uchar i;
for(i=0;i<8;i++) //数据长度为8位
{
if(byte&0x80) sda=1;
else sda=0;
_nop_ ();
scl=1; //将时钟置为高,开始接受数据
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ (); //始终周期
scl=0;
byte<<=1;
}
}
void clk()
{
scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ (); //始终周期
scl=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ (); //始终周期
}
/************************************************
函数名称:Read_e2rom(uint add)
函数功能:从IIc器件中指定地址读出数据
应用范围:全局函数
入口参数: uchar byte
出口参数: 无
*************************************************/
uchar Read_e2rom(uint add)
{
uchar h_add,l_add,rom_data;
h_add=add/256; //计算搞8位地址
l_add=add%256; //计算底8位地址
Start_iic(); //启动总线
Write_byte(0xa0); //启动写操作,先写入地址
clk();
Write_byte(h_add); //先写入高8位地址
clk();
Write_byte(l_add); //先写入低8位地址
clk();
Start_iic(); //启动总线
Write_byte(0xa1); //启动读操作
clk();
rom_data=Read_byte();
clk();
Stop_iic();
return (rom_data);
}
/************************************************
函数名称:void Write_e2rom(uint add,uchar byte)
函数功能:往指定地址中写入数据
应用范围:全局函数
入口参数: uint add,uchar byte
出口参数: 无
*************************************************/
void Write_e2rom(uint add,uchar byte)
{
uchar h_add,l_add,i,j;
h_add=add/256; //计算搞8位地址
l_add=add%256; //计算底8位地址
Start_iic(); //启动总线
Write_byte(0xa0); //启动写操作,先写入地址
clk();
Write_byte(h_add); //先写入高8位地址
clk();
Write_byte(l_add); //先写入低8位地址
clk();
Write_byte(byte); //先写入8位数据
clk();
Stop_iic();
for(i=200;i>0;i--)
{
for(j=30;j>0;j--)
{
_nop_ ();
_nop_ ();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -