#include "anbt_i2c.h"
void ANBT_I2C_Configuration(void)
{
gpio_init (PTD8, GPO,1);
gpio_init (PTD9, GPO,1);
ANBT_I2C_SCL_1;
ANBT_I2C_SDA_1;
ANBT_I2C_DELAY;
}
void ANBT_I2C_Delay(uint32 dly)
{
while(--dly);//dly=10: 8.75us; dly=100: 85.58 us (SYSCLK=72MHz)
}
uint8 ANBT_I2C_START(void)
{
ANBT_I2C_SDA_1;
ANBT_I2C_NOP;
//
ANBT_I2C_SCL_1;
ANBT_I2C_NOP;
//
if(!ANBT_I2C_SDA_STATE) return ANBT_I2C_BUS_BUSY;
//
ANBT_I2C_SDA_0;
ANBT_I2C_NOP;
//
ANBT_I2C_SCL_0;
ANBT_I2C_NOP;
//
if(ANBT_I2C_SDA_STATE) return ANBT_I2C_BUS_ERROR;
//
return ANBT_I2C_READY;
}
void ANBT_I2C_STOP(void)
{
ANBT_I2C_SDA_0;
ANBT_I2C_NOP;
//
ANBT_I2C_SCL_1;
ANBT_I2C_NOP;
//
ANBT_I2C_SDA_1;
ANBT_I2C_NOP;
}
void ANBT_I2C_SendACK(void)
{
ANBT_I2C_SDA_0;
ANBT_I2C_NOP;
ANBT_I2C_SCL_1;
ANBT_I2C_NOP;
ANBT_I2C_SCL_0;
ANBT_I2C_NOP;
}
void ANBT_I2C_SendNACK(void)
{
ANBT_I2C_SDA_1;
ANBT_I2C_NOP;
ANBT_I2C_SCL_1;
ANBT_I2C_NOP;
ANBT_I2C_SCL_0;
ANBT_I2C_NOP;
}
uint8 ANBT_I2C_SendByte(uint8 anbt_i2c_data)
{
uint8 i;
ANBT_I2C_SCL_0;
for(i=0;i<8;i++)
{
if(anbt_i2c_data&0x80) ANBT_I2C_SDA_1;
else ANBT_I2C_SDA_0;
//
anbt_i2c_data<<=1;
ANBT_I2C_NOP;
//
ANBT_I2C_SCL_1;
ANBT_I2C_NOP;
ANBT_I2C_SCL_0;
ANBT_I2C_NOP;
}
//
ANBT_I2C_SDA_1;
ANBT_I2C_NOP;
ANBT_I2C_SCL_1;
ANBT_I2C_NOP;
if(ANBT_I2C_SDA_STATE)
{
ANBT_I2C_SCL_0;
return ANBT_I2C_NACK;
}
else
{
ANBT_I2C_SCL_0;
return ANBT_I2C_ACK;
}
}
uint8 ANBT_I2C_ReceiveByte(void)
{
uint8 i,anbt_i2c_data;
//
ANBT_I2C_SDA_1;
ANBT_I2C_SCL_0;
anbt_i2c_data=0;
//
for(i=0;i<8;i++)
{
ANBT_I2C_SCL_1;
ANBT_I2C_NOP;
anbt_i2c_data<<=1;
//
if(ANBT_I2C_SDA_STATE)anbt_i2c_data|=0x01;
ANBT_I2C_SCL_0;
ANBT_I2C_NOP;
}
ANBT_I2C_SendNACK();
return anbt_i2c_data;
}
uint8 ANBT_I2C_ReceiveByte_WithACK(void)
{
uint8 i,anbt_i2c_data;
//
ANBT_I2C_SDA_1;
ANBT_I2C_SCL_0;
anbt_i2c_data=0;
//
for(i=0;i<8;i++)
{
ANBT_I2C_SCL_1;
ANBT_I2C_NOP;
anbt_i2c_data<<=1;
//
if(ANBT_I2C_SDA_STATE)anbt_i2c_data|=0x01;
ANBT_I2C_SCL_0;
ANBT_I2C_NOP;
}
ANBT_I2C_SendACK();
return anbt_i2c_data;
}
void ANBT_I2C_Receive6Bytes(uint8 *anbt_i2c_data_buffer)
{
uint8 i,j;
uint8 anbt_i2c_data;
for(j=0;j<5;j++)
{
ANBT_I2C_SDA_1;
ANBT_I2C_SCL_0;
anbt_i2c_data=0;
//
for(i=0;i<8;i++)
{
ANBT_I2C_SCL_1;
ANBT_I2C_NOP;
anbt_i2c_data<<=1;
//
if(ANBT_I2C_SDA_STATE)anbt_i2c_data|=0x01;
ANBT_I2C_SCL_0;
ANBT_I2C_NOP;
}
anbt_i2c_data_buffer[j]=anbt_i2c_data;
ANBT_I2C_SendACK();
}
//
ANBT_I2C_SDA_1;
ANBT_I2C_SCL_0;
anbt_i2c_data=0;
for(i=0;i<8;i++)
{
ANBT_I2C_SCL_1;
ANBT_I2C_NOP;
anbt_i2c_data<<=1;
//
if(ANBT_I2C_SDA_STATE)anbt_i2c_data|=0x01;
ANBT_I2C_SCL_0;
ANBT_I2C_NOP;
}
anbt_i2c_data_buffer[5]=anbt_i2c_data;
ANBT_I2C_SendNACK();
}
void ANBT_I2C_Receive12Bytes(uint8 *anbt_i2c_data_buffer)
{
uint8 i,j;
uint8 anbt_i2c_data;
for(j=0;j<11;j++)
{
ANBT_I2C_SDA_1;
ANBT_I2C_SCL_0;
anbt_i2c_data=0;
//
for(i=0;i<8;i++)
{
ANBT_I2C_SCL_1;
ANBT_I2C_NOP;
anbt_i2c_data<<=1;
//
if(ANBT_I2C_SDA_STATE)anbt_i2c_data|=0x01;
mialon
发表于05-09 14:37 浏览65535次