?? i2c.c
字號:
/*************************版權(quán)信息**************************
/*************************版權(quán)信息**************************
*CopyRight(c)
*All rights reserved
*
*文件名稱: i2c.c
*當(dāng)前版本:
*作者:
*完成日期:
*摘要: 24c02操作定義文件,注意I2C總線的數(shù)據(jù)格式
* 先讀寫數(shù)據(jù)高位后低位
************************************************************/
//************************頭文件****************************
#include <reg51.h>
#include <intrins.h>
#include "stdio.h"
#include "i2c.h"
//***********************函數(shù)定義***************************
/***************************************
*函數(shù)名稱: void Start(void)
*功能描述: 讀寫開始
*輸入: 無
*輸出: 無
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void Start(void)
{
I2C_SDA = 1; //起始條件的數(shù)據(jù)信號
_nop_();
I2C_SCL = 1; //起始條件時鐘信號
_nop_(); //信號建立時間>4.7us
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SDA = 0; //起始信號
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0; //鉗住I2C總線, 準備發(fā)送或者接受數(shù)據(jù)
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void Stop(void)
*功能描述: 讀寫結(jié)束
*輸入: 無
*輸出: 無
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void Stop(void)
{
I2C_SDA = 0; //結(jié)束條件的數(shù)據(jù)信號
_nop_();
I2C_SCL = 1; //結(jié)束條件的時鐘信號
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SDA = 1; //結(jié)束信號
_nop_();
_nop_();
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void Ack(void)
*功能描述: 正確應(yīng)答,讀一個字節(jié)后必須應(yīng)答
*輸入: 無
*輸出: 無
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void Ack(void)
{
I2C_SDA = 0;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void NoAck(void)
*功能描述: 無應(yīng)答
*輸入: 無
*輸出: 無
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void NoAck(void)
{
I2C_SDA = 1;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void TestAck(void)
*功能描述: 讀寫錯誤測試,寫一個字節(jié)應(yīng)該測試應(yīng)答信號
*輸入: 無
*輸出: 返回一個位
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void TestAck(void)
{
I2C_SDA = 1;
_nop_();
_nop_();
I2C_SCL = 1;
_nop_();
_nop_();
_nop_();
ErrorBit = I2C_SDA;
I2C_SCL = 0;
_nop_();
_nop_();
}
/***************************************
*函數(shù)名稱: void Write_I2c(uchar date)
*功能描述: 寫I2C
*輸入: 待送數(shù)據(jù),高字節(jié)先送
*輸出: 無
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
void Write_I2c(uchar date)
{
uchar i;
for(i = 0; i < 8; i++)
{
I2C_SDA = date & 0x80; //送數(shù)據(jù)到數(shù)據(jù)線上
date <<= 1;
_nop_();
I2C_SCL = 1; //置時鐘信號為高電平,使數(shù)據(jù)有效
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 0;
_nop_();
_nop_();
}
}
/***************************************
*函數(shù)名稱: uchar Read_I2c(void)
*功能描述: 讀I2C
*輸入: 無
*輸出: 返回一個字節(jié)的數(shù)據(jù),高字節(jié)在前
*全局變量: I2C_SCL,I2C_SDA
*調(diào)用模塊: 無
****************************************/
uchar Read_I2c(void)
{
uchar i;
uchar byte = 0;
for(i = 0; i < 8; i++)
{
I2C_SCL = 0; //置時鐘為低電平,準備接受數(shù)據(jù)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
I2C_SCL = 1; //置時鐘為高電平,使數(shù)據(jù)線數(shù)據(jù)有效
_nop_();
_nop_();
byte <<= 1;
byte |= I2C_SDA;
_nop_();
_nop_();
I2C_SCL = 0;
}
return(byte);
}
/***************************************
*函數(shù)名稱: void DelayMs(uchar time)
*功能描述: 延時
*輸入: 延時時間
*輸出: 無
*全局變量: 無
*調(diào)用模塊: 無
****************************************/
void DelayMs(uchar time)
{
uchar i;
do
{
for(i = 0; i < 125 ; i++); //*延時 8us x 125 = 1ms
}
while (time--);
}
/***************************************
*函數(shù)名稱: void Write_Date(uchar StartAddress,uchar *date,uchar bytes)
*功能描述: 寫數(shù)據(jù)
*輸入: 數(shù)據(jù)開始地址,保存數(shù)據(jù)指針,數(shù)據(jù)字節(jié)數(shù)
*輸出: 無
*全局變量: 無
*調(diào)用模塊: Start(),Write_I2c(),Stop(),TestAck()
*注意事項: 調(diào)用之前,需要定義一個數(shù)組,用來存待發(fā)送的數(shù)據(jù)
****************************************/
void Write_Date(int StartAddress,uchar *date,uchar bytes)
{
uchar i = 0;
Start();
Write_I2c(WR24C02);
TestAck();
Write_I2c(StartAddress);
TestAck();
for(i = 0;i < bytes; i++)
{
Write_I2c(*date);
TestAck();
date++;
}
Stop();
DelayMs(20);
}
/***************************************
*函數(shù)名稱: void Read_Date(uchar StartAddress,uchar *date,uchar bytes)
*功能描述: 讀數(shù)據(jù)
*輸入: 數(shù)據(jù)開始地址,讀取數(shù)據(jù)指針,數(shù)據(jù)字節(jié)數(shù)
*輸出: 無
*全局變量: 無
*調(diào)用模塊: Start(),Write_I2c(),Read_I2c(),Ack(),NoAck(),Stop(),TestAck()
*注意事項: 調(diào)用之前,需要定義一個數(shù)組,用來存讀取的數(shù)據(jù)
****************************************/
void Read_Date(int StartAddress,uchar *date,uchar bytes)
{
uchar i;
Start();
Write_I2c(WR24C02);
TestAck();
Write_I2c(StartAddress);
TestAck();
Write_I2c(RD24C02);
TestAck();
for (i = 0; i < bytes; i++)
{
*date = Read_I2c();
Ack();
date++;
}
NoAck();
Stop();
DelayMs(10);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -