?? 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 + -