內容:函式是採用軟體延時的方法產生scl脈衝,固對高晶振頻率要作一定的修改
(本例是1us機器週期,即晶振頻率要小於12mhz)
#include
#include "iic.h"
bit ack;
啟動匯流排
void iic_start()
sda = 1; //傳送起始條件的資料訊號
scl = 1;
delay_us(1); //起始條件建立時間大於4.7us,延時
sda = 0; //傳送起始訊號
delay_us(1); //起始條件鎖定時間大於4μ
scl = 0; //鉗住i2c匯流排,準備傳送或接收資料
結束匯流排
void iic_stop()
sda = 0; //傳送結束條件的資料訊號
scl = 1;
delay_us(1); //結束條件建立時間大於4μ
sda = 1; //傳送i2c匯流排結束訊號
delay_us(1);
scl = 0;
傳送乙個位元組資料
函式原型: bit iic_send_byte(unsigned char byte);
功能: 將資料byte傳送出去,可以是位址,也可以是資料,發完後等待應答,並對
此狀態位進行操作.(不應答或非應答都使ack=0 假)
傳送資料正常,ack=1; ack=0表示被控器無應答或損壞。
bit iic_send_byte(unsigned char byte)
unsigned char i;
for(i = 0; i < 8; i++) //要傳送的資料長度為8位
sda = byte & 0x80; //判斷傳送位
scl = 1; //置時鐘線為高,通知被控器開始接收資料位
delay_us(1); //保證時鐘高電平週期大於4μ
scl = 0;
byte <<= 1;
scl = 1;
sda = 1; //8位傳送完後釋放資料線,準備接收應答位
delay_us(1);
if(0 == sda) //判斷是否接收到應答訊號
ack = 1;
else
ack = 0;
scl = 0;
return ack;
接受乙個位元組資料
函式原型: unsigned char iic_receive_byte();
功能: 用來接收從器件傳來的資料,並判斷匯流排錯誤(不發應答訊號),發完後請用應答函式。
unsigned char iic_receive_byte()
unsigned char i;
unsigned char a;
unsigned char temp = 0;
sda = 1; //置資料線為輸入方式
for(i = 0; i < 8; i++)
scl = 0; //置時鐘線為低,準備接收資料位
delay_us(1); //時鐘低電平週期大於4.7us
scl = 1; //置時鐘線為高使資料線上資料有效
if(sda)
a = 1;
else
a = 0;
temp |= (a << (7 - i)); //讀資料位,接收的資料位放入retc中
delay_us(1);
scl = 0;
return temp;
應答子函式
void iic_ack()
sda = 0;
scl = 1;
delay_us(1); //時鐘低電平週期大於4μ
scl = 0; //清時鐘線,鉗住i2c匯流排以便繼續接收
非應答子函式
void iic_noack()
sda = 1;
scl = 1;
delay_us(1); //時鐘低電平週期大於4μ
scl = 0; //清時鐘線,鉗住i2c匯流排以便繼續接收
向有子位址器件傳送多位元組資料函式
函式原型: bit iic_send_str(unsigned char sla, unsigned char suba, unsigned char *str, unsigned char len);
功能: 從啟動匯流排到傳送位址,子位址,資料,結束匯流排的全過程。
從器件位址sla,子位址suba,傳送內容是str指向的內容,傳送len個位元組。
如果返回1表示操作成功,否則操作有誤。
注意:使用前必須已結束匯流排。
bit iic_send_str(unsigned char sla, unsigned char suba, unsigned char *str, unsigned char len)
unsigned char i;
iic_start(); //啟動匯流排
iic_send_byte(sla); //傳送器件位址
if(0 == ack)
return err;
iic_send_byte(suba); //傳送器件子位址
if(0 == ack)
return err;
for(i = 0; i < len; i++)
iic_send_byte(*str); //傳送資料
delay_us(1); //必須延時等待晶元內部自動處理資料完畢
if(0 == ack)
return err;
str++;
iic_stop(); //結束匯流排
return succ;
向有子位址器件讀取多位元組資料函式
函式原型: bit iic_receive_str(unsigned char sla, unsigned char suba, unsigned char *str, unsigned char len);
功能: 從啟動匯流排到傳送位址,子位址,讀資料,結束匯流排的全過程。
從器件位址sla,子位址suba,讀出的內容放入str指向的儲存區,讀len個位元組。
如果返回1表示操作成功,否則操作有誤。
注意:使用前必須已結束匯流排。
bit iic_receive_str(unsigned char sla, unsigned char suba, unsigned char *str, unsigned char len)
unsigned char i;
iic_start(); //啟動匯流排
iic_send_byte(sla); //傳送器件位址
if(0 == ack)
return err;
iic_send_byte(suba); //傳送器件子位址
if(0 == ack)
return err;
iic_start();
iic_send_byte(sla + 1);
if(0 == ack)
return err;
for(i = 0; i < len - 1; i++)
*str = iic_receive_byte(); //傳送資料
iic_ack(); //傳送就答位
str++;
*str = iic_receive_byte();
iic_noack(); //傳送非應位
iic_stop(); //結束匯流排
return succ;
51微控制器 IIC
iic inter intergrated circuit 匯流排是一種由philips公司開發的兩線式序列匯流排。用於連線微控制器及其外圍裝置。iic只需兩根線sda 資料線 scl 時鐘 iic支援多主控,當然,在任何時間點上只能有乙個主控,而spi是一主多從。iic各種被控制電路均併聯在這條匯...
51微控制器學習之IIC匯流排
核心思想 主機與從機之間的資訊交換。主機傳送訊息,從機要回應一下。從機傳送訊息,主機也要回應。注意點 sda線和scl線都是預設高電平。即高電平為釋放狀態。include include typedef unsigned char u8 typedef unsigned int u16 void d...
郭天祥51微控制器教程 IIC匯流排
include define uchar unsigned char sbit sda p2 0 資料匯流排 sbit scl p2 1 時鐘匯流排 void delay 大概延時5us void delay1 uchar x 這是乙個寫資料的整體過程 void wirte add uchar ad...