I2C 總線協議時序編程 --AT24C01--- COPYRIGHT (c) 2008 BY bill. -- ALL RIGHTS RESERVED -- File Name: I2C.h Author: bill Created: 2007/12/12 Modified: NO Revision: keil v3.0
fose=12M
*************************************************/
#ifndef _I2C_H_ #define _I2C_H_
#include <intrins.h>
#define uint unsigned int #define uchar unsigned char
sbit Sda="P1"^0; sbit Scl="P1"^1; sbit Wp="P1"^2; /************************** Start **********/ void Start(void) { Sda="1"; Scl="1"; _nop_(); _nop_(); _nop_(); _nop_(); Sda="0"; _nop_(); _nop_(); _nop_(); _nop_(); } /**************** Stop *****************/
void Stop (void) { Sda="0"; Scl="1"; _nop_(); _nop_(); _nop_(); _nop_(); Sda="1"; _nop_(); _nop_(); _nop_(); _nop_(); }
/***************** Ack **************************/
void Ack (void) { Sda="0"; _nop_(); _nop_(); _nop_(); _nop_(); Scl="1"; _nop_(); _nop_(); _nop_(); _nop_(); Scl="0"; }
/*************** No Ack ***************************/
void NoAck (void) { Sda="1"; _nop_(); _nop_(); _nop_(); _nop_(); Scl="1"; _nop_(); _nop_(); _nop_(); _nop_(); Scl="0"; }
/***************** Send a char ***************************/
void Send(uchar Data) //發送數據子程序 Data 為發送的字符 { uchar BitCount="8"; //入口為要發送的字符 Data uchar temp; //無返回值 do { temp="Data"; Scl="0"; _nop_(); _nop_(); _nop_(); _nop_(); if(temp&0x80) Sda="1"; else Sda="0"; Scl="1"; temp="Data"<<1; Data="temp"; BitCount--; }while(BitCount); Scl="0"; }
/***************************** Read a char *********************/
uchar Read(void) //無入口 { //出口為讀出來的數據 temp uchar temp="0"; uchar temp1=0; uchar BitCount="8"; Sda="1"; do{ Scl="0"; _nop_(); _nop_(); _nop_(); _nop_(); Scl="1"; _nop_(); _nop_(); _nop_(); _nop_(); if(Sda) temp="temp|0x01"; else temp="temp"&0xfe; if (BitCount-1) { temp1=temp<<1; temp="temp1"; } BitCount--; } while(BitCount); return temp; }
/*************************** Write a char to Rom ************************/
void WrRoROM (uchar Data[],uchar Address,uchar Num) //寫多字節函數 { //入口 為 要寫的數組 Data[] uchar i="0"; // 地址 Address uchar *PData; // 字節數 Num PData="Data"; Start(); Send(0xa0); Ack(); Send (Address); Ack(); for(i=0;i<Num;i++) { Send(*(PData)) ; Ack(); } Stop(); }
/********************************** Read a char from ROM *************/
void RdFromROM (uchar Data[],uchar Address,uchar Num) //讀字符串 { //入口 為要讀出的數據 Data uchar i="0"; //存放地址 Address uchar *PData; //字節數 Num PData="Data"; for(i=0;i<Num;i++) { Start(); Send(0xa0); Ack(); Send(Address+i); Ack(); Start(); Send(0xa1); Ack(); *(PData+i)=Read(); Scl="0"; NoAck(); Stop(); } }
#endif
/*************************例子************************** void main(void) { uchar Number[4]={1,2,3,4}; Wp=1; WrTOROM(Number,4,4); mdelay(20); while(1); }
mdelay(uchar j) { uint i; for(;j>0;j--) {for(i=0;i<125;i--) {;} } }
參考鏈接:http://www.picavr.com/news/2008-01/2927.htm
|