?? i2c.c
字號:
#include <at89x52.H> // SFR definition header file
#include "SystemEvent.h"
#include "Function.h"
#include "ExtVar.h"
#include <intrins.h>
// ********************************************************************************
// Function: i2c_start;
// Description: Sending a start waveform to I2C bus.
// Input parameters: None.
// Output parameters: None.
// Return values: None.
// ********************************************************************************
void i2cStart(void){
_sda=1;
_sclk=1;
_nop_(); _nop_(); _nop_(); _nop_();
_sda=0;
_nop_(); _nop_(); _nop_(); _nop_();
}
// ********************************************************************************
// Function: i2c_stop;
// Description: Sending a stop waveform to I2C bus.
// Input parameters: None.
// Output parameters: None.
// Return values: None.
// ********************************************************************************
void i2cStop(void){
unsigned int _timeOut;
_timeOut=0;
_sda=0;
_nop_(); _nop_(); _nop_(); _nop_();
_sclk=1;
if((_IDCodeOfI2C==0xb8)||(_IDCodeOfI2C==0xba)){
while((_sclk==0)&&(_timeOut<0x4f00))
{
_nop_();
_timeOut++;
}
}
_sda=1;
_nop_(); _nop_(); _nop_();_nop_();
}
// ********************************************************************************
// Function: i2cTransmit;
// Description: Transmit a byte to the I2C slaver.
// Input parameters: unsigned char valueX: value to transmit.
// Output parameters: unsigned char i: i=0; Ack from slaver was receved
// i=1; Ack was not receved
// Return values: None.
// ********************************************************************************
unsigned char i2cTransmit( unsigned char valueX )
{
unsigned char i;
unsigned int _Timeout;
unsigned char value=valueX;
_sda=0;
_sclk=0;
_nop_(); _nop_(); _nop_(); _nop_();
for (i=0; i<8; i++){
_sclk=0;
_nop_(); _nop_(); _nop_(); _nop_();
if (value & 0x80) _sda=1;
else _sda=0;
_nop_(); _nop_(); _nop_(); _nop_();
_sclk=1;
_nop_(); _nop_(); _nop_(); _nop_();
value <<= 1;
}
_sclk=0;
_nop_(); _nop_(); _nop_(); _nop_();
_sda=1;
_nop_(); _nop_(); _nop_(); _nop_();
_Timeout=0;
_sclk=1;
while((_sda==1)&&(_Timeout<0x2)){
_Timeout++;
}
i=(unsigned char)_sda;
_nop_(); _nop_(); _nop_(); _nop_();
_sclk=0;
_nop_(); _nop_(); _nop_(); _nop_();
return(i);
}
// ********************************************************************************
// Function: i2cLocate;
// Description: Transmit ID and sub addr to the I2C slaver.
// Input parameters: unsigned char slave_addr: I2C device slave ID.
// unsigned char sub_addr: sub address to access of the I2C slaver.
// Output parameters: unsigned char i: i=1; Ack from slave was receved
// i=0; Ack was not receved
// Return values: None.
// ********************************************************************************
unsigned char i2cLocate( unsigned char slave_addr, unsigned char sub_addr )
{
i2cStart();
if(i2cTransmit(slave_addr)) { i2cStop(); return(FALSE); }
else { if(i2cTransmit(sub_addr)) { i2cStop(); return(FALSE);}}
return(TRUE);
}
// ********************************************************************************
// Function: i2cNotAck;
// Description: Return a "Hight" to I2C slaver .
// Input parameters: None.
// Output parameters: None.
// Return values: None.
// ********************************************************************************
void i2cNotAck( void )
{
_sclk=0;
_sda=1;
_sclk=1;
_sclk=0;
}
// ********************************************************************************
// Function: i2cReceive;
// Description: Return 1 byte of data which received from I2C bus.
// Input parameters: None.
// Output parameters: unsigned char value: data been received from I2C bus.
// Return values: None.
// ********************************************************************************
unsigned char i2cReceive( void )
{
/*Read ack.*/
unsigned char i;
unsigned char value;
_sclk=0;
/*Set value bit by bit...MSB first*/
value = 0;
for (i=0; i<8; i++)
{
value <<= 1;
_sclk=0;
if(_sda==1) value|=0x01;
_sclk=1;
}
_sclk=0;
return(value);
}
// ********************************************************************************
// Function: i2c_write;
// Description: Transmit 1 byte of data to slave end with assigned ID and sub address.
// Input parameters: unsigned char slave_addr: I2C slave ID of destination chip.
// unsigned char sub_addr: sub address of destination chip.
// unsigned char _Count: count of data to write
// unsigned char *_DataX: pointer to the data stream will be tramsitted.
// Output parameters: None.
// Return values: None.
// ********************************************************************************
void i2c_write( unsigned char slave_addr, unsigned char sub_addr,unsigned char _Count,unsigned char *_DataX)
{
unsigned int _ix;
i2cStop();
if(((slave_addr&0xf0)!=0x20)&&(slave_addr!=0x78)&&((slave_addr&0xf0)!=0x60)){
if (i2cLocate(slave_addr, sub_addr )){
for(_ix=0;_ix<(unsigned int)_Count;_ix++)
{ i2cTransmit(*(_DataX+(unsigned int)(_ix))); }
}
i2cStop();
}
else {
for(_ix=0;_ix<_Count;_ix++) {
if (i2cLocate(slave_addr, sub_addr+_ix)) i2cTransmit(*(_DataX+_ix));
i2cStop();
}
}
}
// ********************************************************************************
// Function: i2cAck;
// Description: Return a "Low" to I2C slaver as a acknowledgment.
// Input parameters: None.
// Output parameters: None.
// Return values: None.
// ********************************************************************************
void i2cAck( void )
{ //receive state, ack set by master
_sclk=0;
_sda=0;
_sclk=1;
_sclk=0;
_sda=1;
}
// ********************************************************************************
// Function: i2c_read;
// Description: Read data stream from I2C slaver.
// Input parameters: unsigned char slave_addr: I2C slave ID of destination chip.
// unsigned char sub_addr: sub address of destination chip.
// unsigned char _Count: count of data to write
// unsigned char *_DataX: pointer to the data stream will be read.
// Output parameters: None.
// Return values: None.
// ********************************************************************************
void i2c_read( unsigned char slave_addr, unsigned char sub_addr,unsigned char _Count,unsigned char *_DataX )
{
unsigned char _ix;
if(((slave_addr&0xf0)!=0x20)&&(slave_addr!=0x78)&&((slave_addr&0xf0)!=0x60)){
if (i2cLocate(slave_addr, sub_addr)) {
i2cStart();
if(i2cTransmit((unsigned char)(slave_addr | 0x0001))){
i2cStop();
return;
}
for(_ix=0;_ix<_Count;_ix++) {
*(_DataX+(unsigned int)_ix) = i2cReceive();
if(_ix==(_Count-1)) i2cNotAck();
else i2cAck();
}
i2cStop();
}
}
else {
for(_ix=0;_ix<_Count;_ix++) {
if (i2cLocate(slave_addr,sub_addr+_ix)){
i2cStart();
if(i2cTransmit(slave_addr|0x0001)){
i2cStop();
return;
}
*(_DataX+(unsigned int)_ix) = i2cReceive();
i2cNotAck(); i2cStop();
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -