?? i2c.c
字號(hào):
/*******************************************************************************
Copyright @ 2007 Centron Telecom All rights reserved
* File Name: I2C.c
* Author: MingliangBi
* Email: liangzi0708@163.com
* Date: 2008/03/17
* Version: 1.00
* Description: explant I2C Protocol V2.0 on Atmega128
* History: 2008/03/17 MingliangBi V1.00
*******************************************************************************/
#include "App\Global.h"
#include "App\time.h"
#include "C8051F020.h"
#include "I2C.h"
/*******************************************************************************
* 函數(shù)名稱: I2C_WriteByte
* 功能描述: 向目標(biāo)器件寫入一個(gè)字節(jié)數(shù)據(jù)
* 入口參數(shù): DeviceWriteAddress,目標(biāo)器件的寫地址
WordAddress,目標(biāo)器件待寫入的存儲(chǔ)單元地址(>8位,分兩次發(fā)送)
WriteData,待寫入的字節(jié)數(shù)據(jù)
* 返回值 : OK,操作成功;NG,操作失敗
*******************************************************************************/
BOOLEAN I2C_WriteBlock(INT8U DeviceWriteAdd,INT8U *pWriteData,INT16U StartWordAdd,INT16U size)
{
INT16U i;
i=0;
//第一步:產(chǎn)生起始條件
I2CStart();
I2CWaitAck();
if(I2CCheckAck()!=I2C_START)
return NG;
I2C_CLEAR_START_BIT();
//第二步:發(fā)送目標(biāo)器件寫地址
I2CSendByte(DeviceWriteAdd);
I2CWaitAck();
if(I2CCheckAck()!=I2C_MT_SLA_ACK)
return NG;
//第三步:發(fā)送存儲(chǔ)存儲(chǔ)字節(jié)高地址
I2CSendByte((INT8U)((StartWordAdd&0xFF00)>>8));
I2CWaitAck();
if((I2CCheckAck()!=I2C_MT_DATA_ACK))
return NG;
//第四步:發(fā)送存儲(chǔ)存儲(chǔ)字節(jié)低地址
I2CSendByte((INT8U)(StartWordAdd&0x00FF));
I2CWaitAck();
if((I2CCheckAck()!=I2C_MT_DATA_ACK))
return NG;
//第五步:連續(xù)發(fā)送字節(jié)數(shù)據(jù)
for(i=0;i<size;i++)
{
I2CSendByte(*pWriteData);
pWriteData++;
I2CWaitAck();
if((I2CCheckAck()!=I2C_MT_DATA_ACK))
return NG;
}
//第六步:產(chǎn)生結(jié)束條件
I2CStop();
return OK;
}
/*******************************************************************************
* 函數(shù)名稱: I2C_ReadByte
* 功能描述: 從目標(biāo)器件讀取一個(gè)字節(jié)數(shù)據(jù)
* 入口參數(shù): DeviceWriteAddress,目標(biāo)器件的寫地址
WordAddress,目標(biāo)器件待讀取的存儲(chǔ)單元地址(>8位,分兩次發(fā)送)
DeviceReadAddress,目標(biāo)器件的讀地址
pReadData,返回指向存儲(chǔ)單元值的指針
* 返回值 : OK,操作成功;NG,操作失敗
*******************************************************************************/
BOOLEAN I2C_ReadBlock(INT8U DeviceWriteAdd,INT8U DeviceReadAdd,INT8U *pReadData,INT16U StartWordAdd,INT16U size)
{
INT16U i;
i=0;
//第一步:產(chǎn)生起始條件
I2CStart();
I2CWaitAck();
if(I2CCheckAck()!=I2C_START)
return NG;
I2C_CLEAR_START_BIT();
//第二步:發(fā)送目標(biāo)器件寫地址
I2CSendByte(DeviceWriteAdd);
I2CWaitAck();
if(I2CCheckAck()!=I2C_MT_SLA_ACK)
return NG;
//第三步:發(fā)送存儲(chǔ)存儲(chǔ)字節(jié)高地址
I2CSendByte((INT8U)((StartWordAdd&0xFF00)>>8));
I2CWaitAck();
if((I2CCheckAck()!=I2C_MT_DATA_ACK))
return NG;
//第四步:發(fā)送存儲(chǔ)存儲(chǔ)字節(jié)低地址
I2CSendByte((INT8U)(StartWordAdd&0x00FF));//此處數(shù)據(jù)傳輸錯(cuò)誤,改寫格式如下:
//I2CSendByte(0x10);
I2CWaitAck();
if((I2CCheckAck()!=I2C_MT_DATA_ACK))
return NG;
//第五步:重啟動(dòng)
//I2C_CLEAR_INT_BIT();//重啟動(dòng)前清除中斷
//I2CStart();
I2CRestart();
I2CWaitAck();
if(I2CCheckAck()!=I2C_RESTART)
return NG;
I2C_CLEAR_START_BIT();
//第六步:發(fā)送目標(biāo)器件的讀地址
I2CSendByte(DeviceReadAdd);
I2CWaitAck();
if(I2CCheckAck()!=I2C_MR_SLA_ACK)
return NG;
//第七步:接收數(shù)據(jù),完畢產(chǎn)生NACK 連續(xù)接收數(shù)據(jù)
for(i=0;i<size-1;i++)
{
I2CSendAck();
I2CWaitAck();
if(I2CCheckAck()!=I2C_MR_DATA_ACK)
break;
*pReadData=I2C_DATA_REGISTER;
pReadData++;
}
//接收最后一個(gè)字節(jié)數(shù)據(jù)不需要回饋
I2CSendNAck();
I2CWaitAck();
if(I2CCheckAck()!=I2C_MR_DATA_NACK)
return NG;
*pReadData=I2C_DATA_REGISTER;
//第八步:結(jié)束數(shù)據(jù)傳輸
I2CStop();
return OK;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -