This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Ic2 programming interfacing DS895450

Hi,
This programing is to Start I2c Communication with the basic start up code followed by sending a 8 bit address together with a write bit. Next, it will send a string a serial port to show a string "nack" only if the SDA is not pulled low, which means not acknowledged.

Chip used: Dallas DS89C450 11.0592Mhz
Accelerometer: SEN 10955 2.25 Mhz

Problem faced: SDA could not be pulled low. Nack received.

Question: May i know is there any faults in this program?

#include <DS89C4XX.h>     //DS89C450 Microcontroller
#include <intrins.h>      //_nop_() function

sbit SDA=P1^0;
sbit SCL=P1^1;
//--------------------------Transmit----------------------------------
void Uart_Tx2(unsigned char c)
{
        while (TI_0==0);
        TI_0=0;
        SBUF0=c;
}

// ----------------------Transmit string ------------------------------------------------------
void sendstring (char *String)
{
        int i=0;        //set counter to 0
        while(String[i])
        {
                Uart_Tx2(String[i++]);
        }

}


//-------------------------------Delay -----------------------------------------
void I2CBitDly()   // wait approximately 4.7uS
{ // tune to xtal. This works at 11.0592MHz
unsigned int time_end = 9;
unsigned int index;
for (index = 0; index < time_end; index++);
return;
}


//-------------------------------------------Start--------------------------
void I2CSendStart(void)
{
SDA = 1;
I2CBitDly();
SCL = 1;
I2CBitDly();
SDA = 0;
I2CBitDly();
SCL = 0;
I2CBitDly();
}

//-------------------------------------------STOP-----------------------------
void I2CSendStop(void)
{
SDA = 0;
I2CBitDly();
SCL = 1;
I2CBitDly();
SDA = 1;
I2CBitDly();
}

//-----------------------------------------SEND data---------------------------
void I2CSendByte(unsigned char bt)
{
register unsigned char i;
for (i=0; i<8; i++)
{
if ((bt<<i)&0x80) SDA = 1; // Send each bit
else SDA = 0;

SCL = 1;
I2CBitDly();
SCL = 0;
I2CBitDly();

}
SDA = 1; // make P1.0 an input.
I2CBitDly();
SCL = 1;        // 9th clock high.
I2CBitDly();


if (SDA == 1) //
{
        sendstring("nack");             // SDA is not pulled low. nack is sent.

}
   SCL = 0;


I2CBitDly();
//SDA = 1; // end transmission
SCL = 1;
}



//---------------MAIN---------------------------------
void main ()
{

         SCON1  = 0x52;
         SCON0 = 0x52;
         TMOD  = 0x20;
         TCON  = 0x69;
         TH1   = 0xFD;  //Buad Rate: 9600 bps



         I2CSendStart();
         I2CSendByte(0x38);

   while(1)
   {

   };
}

Parents
  • You are testing SDA after you set SCL high. This can't work. If the SDA would change while SCL is high 'other' I2C devices would see a 'start' or 'stop' condition on the bus. After you set SCL high then set SCL low again and then test the SDA state. Please read the I2C specification carefully. Read what happens on rising and falling edge of the SCL signal.

Reply
  • You are testing SDA after you set SCL high. This can't work. If the SDA would change while SCL is high 'other' I2C devices would see a 'start' or 'stop' condition on the bus. After you set SCL high then set SCL low again and then test the SDA state. Please read the I2C specification carefully. Read what happens on rising and falling edge of the SCL signal.

Children