資源簡(jiǎn)介
使用AVR單片機(jī)的普通IO口模擬I2c總線時(shí)序。用實(shí)時(shí)時(shí)鐘芯片演示例子。

代碼片段和文件信息
#include??
#include??
#include??“iic.h“
#define?uchar?unsigned?char
#define?uint?unsigned?int
/********************************************************************
??此程序是I2C操作平臺(tái)(主方式的軟件平臺(tái))的底層的C子程序如發(fā)送數(shù)據(jù)
及接收數(shù)據(jù)應(yīng)答位發(fā)送并提供了幾個(gè)直接面對(duì)器件的操作函數(shù),它很方便的
與用戶程序連接并擴(kuò)展.....
????注意:函數(shù)是采用軟件延時(shí)的方法產(chǎn)生SCL脈沖固對(duì)高晶振頻率要作
一定的修改....(本例是1us機(jī)器周期即晶振頻率要小于12MHZ)
********************************************************************/
#define??uchar?unsigned?char?/*宏定義*/
#define??uint??unsigned?int
#define??_Nop()??asm(“nop“)????????/*定義空指令*/
/*?常變量定義區(qū)?*/
?????????????????????????????????????????????????/*端口位定義*/
#define?SDA??PORTA_Bit1???????????/*模擬I2C數(shù)據(jù)傳送位*/
#define?SCL??PORTA_Bit0???????????/*模擬I2C時(shí)鐘控制位*/
#define?SDA_pin?DDRA_Bit1??????????/*SDA輸入輸出*/
#define?SCL_pin?DDRA_Bit0
#define?SDA_in?PINA_Bit1
#define?iic_delay()?delay_us(1)????????//?根據(jù)系統(tǒng)時(shí)鐘進(jìn)行調(diào)整
uchar?TAB_T[]={?0x310x060x10//秒分時(shí)
0x130x010x070x08};//日星期月年.
void delay_us(?uchar?us?)
{
uchar?dly;
????while?(?us?--?)
????{
????????for(dly=0;dly<8;dly++);
????}
}
?????????????????????????????????????????????????/*狀態(tài)標(biāo)志*/
uchar?ack; ?????????/*應(yīng)答標(biāo)志位*/
/*******************************************************************
?????????????????????起動(dòng)總線函數(shù)
函數(shù)原型:?void??Start_I2c();
功能:???????啟動(dòng)I2C總線即發(fā)送I2C起始條件.
********************************************************************/
void?Start()
{
????SCL_pin=0;
????SDA_pin=0;
????SDA=1;??????/*發(fā)送起始條件的數(shù)據(jù)信號(hào)*/
????_Nop();
????SCL=1;
????iic_delay();/*起始條件建立時(shí)間大于4.7us延時(shí)*/
????SDA_pin=1;
????SDA=0;??????/*發(fā)送起始信號(hào)*/
????iic_delay();/*?起始條件鎖定時(shí)間大于4μs*/
????SCL=0;??????/*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)?*/
????SCL_pin=1;
????iic_delay();
}
/*******************************************************************
??????????????????????結(jié)束總線函數(shù)
函數(shù)原型:?void??Stop_I2c();
功能:???????結(jié)束I2C總線即發(fā)送I2C結(jié)束條件.
********************************************************************/
void?Stop()
{
????SDA=0;??????????/*發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)*/
????SDA_pin=1;
????iic_delay();????/*發(fā)送結(jié)束條件的時(shí)鐘信號(hào)*/
????SCL_pin=0;
????SCL=1;
????iic_delay();????/*結(jié)束條件建立時(shí)間大于4μs*/
????SDA_pin=0;
????SDA=1;??????????/*發(fā)送I2C總線結(jié)束信號(hào)*/
????iic_delay();
}
/*******************************************************************
?????????????????字節(jié)數(shù)據(jù)傳送函數(shù)
函數(shù)原型:?void??SendByte(uchar?c);
功能:??將數(shù)據(jù)c發(fā)送出去可以是地址也可以是數(shù)據(jù)發(fā)完后等待應(yīng)答并對(duì)
?????此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0?假)
?????發(fā)送數(shù)據(jù)正常,ack=1;?ack=0表示被控器無(wú)應(yīng)答或損壞。
********************************************************************/
void??WriteByte(uchar?c)
{
????uchar?BitCnt;
????for(BitCnt=0;BitCnt<8;BitCnt++)??/*要傳送的數(shù)據(jù)長(zhǎng)度為8位*/
????{
????????if((c< ????????{
????????????SDA_pin=0;
????????????SDA=1;???/*判斷發(fā)送位*/
????????}
????????else
????????{
????????????SDA=0;
????????????SDA_pin=1;
????????}
????????_Nop();
????????SCL_pin=0;
????????SCL=1;???????????????/*置時(shí)鐘線為高,通知被控器開(kāi)始接收數(shù)據(jù)位*/
????????iic_delay();?????????/*保證時(shí)鐘高電平周期大于4μs*/
????????SCL=0;
????????SCL_pin=1;
????}
????iic_delay()?;
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????3742??2009-11-21?19:09??iic.h
?????文件???????6647??2009-12-18?08:42??IIC.c
-----------?---------??----------?-----??----
????????????????10389????????????????????2
評(píng)論
共有 條評(píng)論