|
// This module is ADS1110 Driver
#include
#include "430i2c.h"
void InitI2cPort(void)
{
P2DIR |=SCL;//Set SDA and SCL to output mode
P1DIR |=SDA;
P2OUT |=SCL;//SDA=1,SCL=1.
P1OUT |=SDA;
}
void I2C_delay(void)
{ unsigned char i;
for (i=0;i<2;i++);
}
void i2c_clock(void)
{
P2OUT &=~SCL;//SCL=0
I2C_delay();
P2OUT |=SCL;//SCL=1
I2C_delay();
P2OUT &=~SCL;//SCL=0
}
/* Generate a ACK */
/* The Master Send a ACK to device*/
void ack(void)
{
P2OUT &=~SCL;//SCL=0
I2C_delay();
SDA_OUT;//SDA output mode
P1OUT &=~SDA;//SDA=0;
I2C_delay();
P2OUT |=SCL;// SCL=1
I2C_delay();
P2OUT &=~SCL;//SCL=0
SDA_IN;// SDA input mode
}
/*Receive device sending a ack*/
void RcvAck(void)
{
SDA_IN;
I2C_delay();
P2OUT |=SCL;
I2C_delay();
P2OUT &=~SCL;
SDA_IN;
}
/* The Master send a NACK to device*/
/* Generate a NACK */
void nack(void)
{
SDA_OUT;
P2OUT |=SDA;//SDA=1
I2C_delay();
P2OUT |=SCL;//SCL=1
I2C_delay();
P2OUT &=~SCL;//SCL=0
SDA_IN;
}
//Waiting for a ACK from device
void wait_ack(void)
{
unsigned char i;
SDA_IN;
I2C_delay();
P2OUT |=SCL;//SCL=1
I2C_delay();
i=0x0FF;
do
{
}
while(--i!=0);
P2OUT &=~SCL;//SCL=0;
SDA_OUT;
}
/*Start I2C BUS */
void start_i2c(void)
{
SDA_OUT;
P1OUT |=SDA;//SDA=1
P2OUT |=SCL;// SCL=1
I2C_delay();
P1OUT &=~SDA;//SDA=0
I2C_delay();
P2OUT &=~SCL;// SCL=0;
}
/* Stop I2C BUS*/
void stop_i2c(void)
{
SDA_OUT;
P1OUT &=~SDA;//SDA=0
I2C_delay();
P2OUT |=SCL;//SCL=1
I2C_delay();
P1OUT |=SDA;//SDA=1
}
/* Send one unsigned char data to I2C Bus */
/* Inport: unsigned char data*/
/* Return : none*/
void outbyt(uchar i2c_data)
{
unsigned char i;
SDA_OUT;
for(i=0;i<8;i++)
{
if(i2c_data&0x80)
{
P1OUT |=SDA;//SDA=1
}
else
{
P1OUT &=~SDA;//SDA=0
}
i2c_clock();
i2c_data <<=1;
}
}
/* Read a byte Data from I2c device*/
uchar inbyt(void)
{
unsigned char i,i2c_data,TmpIn;
SDA_IN;//SDA turn to input mode
i2c_data=0;
i=8;
while(i--)
{
i2c_data<<=1;
P2OUT &=~SCL;//SCL=0
I2C_delay();
P2OUT |=SCL;//SCL=1
TmpIn=P1IN;
TmpIn &=SDA;
TmpIn >>=2;
i2c_data|=TmpIn;
I2C_delay();
}
P2OUT &=~SCL;//SCL=0
return(i2c_data);
}
/*Write ADS1110 Configuration Register*/
// Inport: Value of Configuration Register
// Return :none
void WriteCfgReg(uchar CfgData)
{
start_i2c();
outbyt(I2C_WRITE);
wait_ack();
outbyt(CfgData);
wait_ack();
stop_i2c();
}
// Read data from ADS1110 Data register
uint ReadDataCfgReg(uchar ReadType )
{
uint Tmp,Tmp1;
start_i2c();
outbyt(I2C_READ);
RcvAck();
Tmp=inbyt()*0x100;
ack();
Tmp+=(inbyt());
ack();
Tmp1=inbyt();
ack();
stop_i2c();
if(ReadType==READ_DATA)
{
if(Tmp >0x7FFF)
{
Tmp=0x0000;
return(Tmp);
}
else
{
return(Tmp);
}
}
else
{
return(Tmp1);
}
}
先给个参考 |
|