AtomSoft
Well-Known Member
Need some help heh
This is my code so far. For some reason it doesnt even send a start signal. I must be missing something...
I2C Code:
Main Code:
This is my code so far. For some reason it doesnt even send a start signal. I must be missing something...
I2C Code:
Code:
unsigned char I2C_RECV(unsigned char REG)
{
unsigned char temp;
I2C0CONSET |= 0x20; //Send Start Signal
while(I2C0STAT != 8); //A START condition has been transmitted
I2C0DAT=ACCW; //Set I2C0DAT with SLA + W bit
I2C0CONCLR=0x28; //START flag Clear & I2C interrupt Clear
while(I2C0STAT != 24); //SLA+W has been transmitted; ACK has been received.
I2C0DAT=REG; //Set I2C0DAT with REG Byte
I2C0CONCLR=0x8; //I2C interrupt Clear
while(I2C0STAT != 40); //Data byte in I2C0DAT has been transmitted; ACK has been received.
I2C0CONSET = 0x20; //Send Start Signal AGAIN
while(I2C0STAT != 0x10); //A Repeated START condition has been transmitted
I2C0DAT=ACCR; //Set I2C0DAT with SLA + R bit
I2C0CONCLR=0x28; //START flag Clear & I2C interrupt Clear
while(I2C0STAT != 0x40); //SLA+R has been transmitted; ACK has been received.
while(I2C0STAT != 0x58); //Data byte has been received; NOT ACK has been returned.
temp = I2C0DAT; //temp holds data
I2C0CONSET=0x10; //Send a Stop Signal
I2C0CONCLR=0x8; //I2C interrupt Clear
return temp;
}
void I2C_SEND(unsigned char REG,unsigned char DATA)
{
I2C0CONSET |= 0x20; //Send Start Signal
while(I2C0STAT != 8); //A START condition has been transmitted
I2C0DAT=ACCW; //Set I2C0DAT with SLA + W bit
I2C0CONCLR=0x28; //START flag Clear & I2C interrupt Clear
while(I2C0STAT != 24); //SLA+W has been transmitted; ACK has been received.
I2C0DAT=REG; //Set I2C0DAT with REG Byte
I2C0CONCLR=0x8; //I2C interrupt Clear
while(I2C0STAT != 40); //Data byte in I2C0DAT has been transmitted; ACK has been received.
I2C0DAT=DATA; //Set I2C0DAT with Data Byte
I2C0CONCLR=0x8; //I2C interrupt Clear
while(I2C0STAT != 40); //Data byte in I2C0DAT has been transmitted; ACK has been received.
I2C0CONSET=0x10; //Send a Stop Signal
I2C0CONCLR=0x8; //I2C interrupt Clear
}
void InitI2C(void)
{
PINSEL0 |= 0x50; //Pins 2,3 are I2C0 Pins SCL,SDA
IO0DIR &=~(1<<4); //Pin P0.4 aka Interrupt Pin is input (defined as ACCINT)
I2C0SCLH = 65; // 50Mhz / 130 = 384,615 Hz MAX from MMA7660FC = 400khz
I2C0SCLL = 65;
I2C0CONSET = 0x40; //Enable I2C
I2C0CONSET = 0x64;
I2C0CONCLR = 0x08; //Clear Interrupt Flag
I2C0CONCLR = 0x20; //Clear Interrupt Flag
}
Main Code:
Code:
#define ACCW 0x98
#define ACCR 0x99
#define ACCINT ((IO0PIN >> 4) & 0x01)
//......
int main(void)
{
int MyRes = 0;
ctl_global_interrupts_disable();
PINSEL0 = 0x00000000; //All GPIO
PINSEL1 = 0x00000000; //All GPIO
IO0DIR = 0xFFFFFFFF; //All Output
IO0CLR = 0xFFFFFFFF; //All Low
IO0DIR &= ~(MySw); //Button is input
InitTimer1();
debug_printf("Timer 1 Init Complete\n\r");
InitUart0();
debug_printf("UART Init Complete\n\r");
InitI2C();
debug_printf("I2C Init Complete\n\r");
I2C_SEND(0x06,0x10); //There is an automatic interrupt after every measurement
while(1) {
MyRes = 0;
if(ACCINT > 0)
MyRes = I2C_RECV(0x00);
debug_printf("MyRes = %i\n\r",MyRes);
}
return 0;
}