?? i2c_2.c
字號:
/*******************************************************************
一、程序說明:
1, 24LC02器件地址是1010000R/W. 同時也一部分為SMBUS 0x16
2, 數組寫入24LC02采取頁寫方式.
3, 數組code從24LC02讀出時采取自由讀方式.
4, 采用4.00M晶體。
5,采用軟件I2C。
二、硬件連接:
1, SDA_DIRE------->23 pin.(當然你可以任意選擇腳位)
2, SCL_DIRE------->18 Pin.(當然你可以任意選擇腳位)
3, PORTD----->外接8個LED,顯示讀出的數據,在這里,讀出的剛好是一個閃動的流水燈狀態。
*******************************************************************/
#include "pic.h"
#define uchar unsigned char
#define nop() asm("nop")
//#define SCL_DIRE TRISC3 //PIC mcu專用I2C
//#define SDA_DIRE TRISC4
//#define SCL RC3
//#define SDA_E RC4
//#define SCL RA0
//#define SDA RA1
//#define SCL_DIR TRISA0
//#define SDA_DIR TRISA1
void start_i2c();
void stop_i2c();
void send_byte(uchar c);
uchar receive_byte();
void I_send_str(uchar sla,uchar suba,uchar *s,uchar no);
void I_send_word(uchar sla,uchar suba,uchar datal,uchar datah);
void delay_250ms();
void i2c_error ();
int ReadByte_EE(uchar addr);
uchar code[]={0x34,0x64,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
uchar no,ack,c,data;
/*******************************************************************
起動總線函數
函數原型: void start_i2c();
Function: start on the I2C bus
*******************************************************************/
void start_i2c()
{
SDA_DIR=1; //發送啟始條件的數據信號
nop();
SCL_DIR=1;
nop();nop();nop();nop();nop(); //24LC02要求建立時間大于4,7S
SDA_DIR=0; //發送起始信號
nop();nop();nop();nop();nop();
SCL_DIR=0; //鉗住I2C總線,準備發送數據或接收數據
nop();nop();
}
/*******************************************************************
停止總線函數
函數原型: void stop_i2c();
Function: stop the I2C bus
*******************************************************************/
void stop_i2c()
{
SDA_DIR=0; //發送結束條件的數據信號
nop();
SCL_DIR=1;
nop();nop();nop();nop();nop();
SDA_DIR=1;
nop();nop();nop();nop();
}
/*=================================================================
字節數據傳送函數
函數原型: void send_byte(uchar c);
Function: 將數據C發送出去,可以是地址,也可以是數據,發完后等待回應,并對此狀態
位進行操作(不應答或非應答都使ack=0 ),發送數據正常,ack=1;ack=0
表示被控器無應答或損壞。
==================================================================*/
void send_byte(uchar c)
{
uchar bit_count;
for (bit_count=0;bit_count<8;bit_count++)
{
if ((c<<bit_count)&0x80) {SDA_DIR=1;}
else {SDA_DIR=0;}
nop();
SCL_DIR=1;
nop();nop();nop();nop();nop();
SCL_DIR=0;
}
nop();nop();
SDA_DIR=1;
nop();nop();
SCL_DIR=1;
nop();nop();nop();
if (SDA==1) ack=0;
else ack=1; //用ASK=1為有應答信號
SCL_DIR=0;
nop();nop();
}
/*==================================================================
字節數據接收函數
函數原型:uchar receive_byte();
FUNCTION: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
發完后請用應答函數。
===================================================================*/
uchar receive_byte()
{
uchar retc,bit_count;
retc=0;
SDA_DIR=1;
for (bit_count=0;bit_count<8;bit_count++)
{
nop();
SCL_DIR=0;
nop();nop();nop();nop();nop();
SCL_DIR=1;
nop();nop();
retc=retc<<1;
if (SDA==1) retc=retc+1;
nop();nop();
}
SCL_DIR=0;
nop();nop();
return (retc);
}
////////********************************//////////////
int ReadByte_EE(uchar addr){
uchar data1;
start_i2c();
send_byte(0xA0); //發送器件地址,即DEVICE ADDRESS。
if (ack==0) i2c_error(); //如果24LC02無應答。則進入I2C ERROR錯誤指示。
send_byte(addr); //發送字地址,即WORD ADDRESS。D口顯示數組。
if (ack==0) i2c_error();
start_i2c(); //重新啟動總線。
send_byte(0xA1); //發送讀命令和器件地址DEVICE ADDRESS。
if (ack==0) i2c_error();
data1=receive_byte();
stop_i2c();
return(data1);
}
/*================================================================
向有子地址器件發送多字節數據函數
函數原型: bit I_send_str(uchar sla,uchar suba,uchar *s,uchar no);
Function: 從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla。如果
返回1表示操作成功,否則操作有誤。
=================================================================*/
void I_send_str(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
start_i2c();
send_byte(sla);
if (ack==0) i2c_error();
send_byte(suba);
if (ack==0) i2c_error();
for (i=0;i<no;i++)
{
send_byte(*s);
if (ack==0) i2c_error();
s++;
}
stop_i2c();
// return(1);
}
/*================================================================
向有子地址器件發送兩字節數據函數
函數原型: bit I_send_word(uchar sla,uchar suba,uchar datal,uchar datah);
Function: 從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla。如果
返回1表示操作成功,否則操作有誤。
=================================================================*/
void I_send_word(uchar sla,uchar suba,uchar datal,uchar datah)
{
uchar i;
start_i2c();
send_byte(sla);
if (ack==0) i2c_error();
send_byte(suba);
if (ack==0) i2c_error();
send_byte(datal);
if (ack==0) i2c_error();
send_byte(datah);
if (ack==0) i2c_error();
stop_i2c();
// return(1);
}
/*****************************************************************
延時函數
函數原型: void delay_250ms();
FUNCTION: 延明250ms
*****************************************************************/
void delay_250ms()
{
unsigned int d=24999;
while (--d);
}
/*****************************************************************
總線錯誤函數
函數原型: void i2c_error();
Function: 通過RD7閃動8次表示總線操作失敗一次報警。
*****************************************************************/
void i2c_error ()
{
uchar i;
for (i=0;i<8;i++)
{
RB7=0;
delay_250ms();
RB7=1;
delay_250ms();
}
}
/**********END**************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -