51微控制器 軟體模擬IIC

2021-07-31 10:09:05 字數 3711 閱讀 5722

名稱:iic協議

內容:函式是採用軟體延時的方法產生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...