資源簡介
使用AVR單片機的普通IO口模擬I2c總線時序。用實時時鐘芯片演示例子。

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