// FILE: I2CComms.C // TITLE: DSP28035 (60Mhz)I2C test // Temperature Sensor TMP100 connected to GPIO33 (SCL) and GPIO32(SDA) // LED GPIO34 as life indicator 100 ms toggle // 12 bit mode of TMP100, 1/16 degree celcius resolution // use watch window for variable "temperature" (type int; qvalue:8) //########################################################################### #include "DSP2803x_Device.h" // TMP100 commands #define TMP100_SLAVE 0x48 // slave address TMP100 (ADDR0=ADDR1=0) #define POINTER_TEMPERATURE 0 #define POINTER_CONFIGURATION 1 #define POINTER_T_LOW 2 #define POINTER_T_HIGH 3 // external function prototypes extern void InitSysCtrl(void); extern void InitPieCtrl(void); extern void InitPieVectTable(void); extern void DSP28x_usDelay(long LoopCnt); // Prototype statements for functions found within this file. void Gpio_select(void); void I2CA_Init(void); long WaitTime = 110; // (9.3uS) @ 60Mhz TMS320F28035 int temperature; // temperature = 2' Komplement of temparature (-128 ... +127 Celsius) // is an I8Q8 - Value void main(void) { InitSysCtrl(); // Basic Core Init from DSP2833x_SysCtrl.c DINT; // Disable all interrupts Gpio_select(); // GPIO9, GPIO11, GPIO34 and GPIO49 as output // to 4 LEDs at Peripheral Explorer // Initialize I2C I2CA_Init(); // Send START, set pointer to Configuration register and set resolution to 12 bit I2caRegs.I2CCNT = 2; I2caRegs.I2CDXR = POINTER_CONFIGURATION; I2caRegs.I2CMDR.all = 0x6E20; /* Bit15 = 0; no NACK in receiver mode Bit14 = 1; FREE on emulation halt Bit13 = 1; STT generate START Bit12 = 0; reserved Bit11 = 1; STP generate STOP Bit10 = 1; MST master mode Bit9 = 1; TRX master - transmitter mode Bit8 = 0; XA 7 bit address mode Bit7 = 0; RM nonrepeat mode, I2CCNT determines # of bytes Bit6 = 0; DLB no loopback mode Bit5 = 1; IRS I2C module enabled Bit4 = 0; STB no start byte mode Bit3 = 0; FDF no free data format Bit2-0: 0; BC 8 bit per data byte */ while(I2caRegs.I2CSTR.bit.XRDY == 0); // wait until first byte is out I2caRegs.I2CDXR = 0x60; // TMP100 in 12 bit mode (R1=R0=1) while(I2caRegs.I2CSTR.bit.SCD == 0); // wait for STOP condition I2caRegs.I2CSTR.bit.SCD = 1; while(1) { DSP28x_usDelay(WaitTime); // Delay time between STOP and START condition // Send START and set pointer to temperature - register I2caRegs.I2CCNT = 1; // pointer to temperature register I2caRegs.I2CDXR = POINTER_TEMPERATURE; // Send start as master transmitter I2caRegs.I2CMDR.all = 0x6620; /* Bit15 = 0; no NACK in receiver mode Bit14 = 1; FREE on emulation halt Bit13 = 1; STT generate START Bit12 = 0; reserved Bit11 = 0; STP not generate STOP Bit10 = 1; MST master mode Bit9 = 1; TRX master - transmitter mode Bit8 = 0; XA 7 bit address mode Bit7 = 0; RM nonrepeat mode, I2CCNT determines # of bytes Bit6 = 1; DLB no loopback mode Bit5 = 1; IRS I2C module enabled Bit4 = 0; STB no start byte mode Bit3 = 0; FDF no free data format Bit2-0: 0; BC 8 bit per data byte */ while(I2caRegs.I2CSTR.bit.ARDY == 0); // wait for access ready condition I2caRegs.I2CCNT = 2; // read 2 byte temperature I2caRegs.I2CMDR.all = 0x6C20; /* Bit15 = 0; no NACK in receiver mode Bit14 = 1; FREE on emulation halt Bit13 = 1; STT generate START Bit12 = 0; reserved Bit11 = 1; STP generate STOP Bit10 = 1; MST master mode Bit9 = 0; TRX master - receiver mode Bit8 = 0; XA 7 bit address mode Bit7 = 0; RM nonrepeat mode, I2CCNT determines # of bytes Bit6 = 0; DLB no loopback mode Bit5 = 1; IRS I2C module enabled Bit4 = 0; STB no start byte mode Bit3 = 0; FDF no free data format Bit2-0: 0; BC 8 bit per data byte */ while(I2caRegs.I2CSTR.bit.RRDY == 0); // wait for 1st byte temperature = I2caRegs.I2CDRR << 8; // read upper 8 Bit (integers) // RRDY is automatically cleared by read of I2CDRR while(I2caRegs.I2CSTR.bit.RRDY == 0); // wait for 2nd byte temperature += I2caRegs.I2CDRR; // read lower 8 Bit (fractions) } } void Gpio_select(void) { EALLOW; GpioCtrlRegs.GPAMUX1.all = 0; // GPIO15 ... GPIO0 = General Puropse I/O GpioCtrlRegs.GPAMUX2.all = 0; // GPIO31 ... GPIO16 = General Purpose I/O GpioCtrlRegs.GPBMUX1.all = 0; // GPIO47 ... GPIO32 = General Purpose I/O GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 1; // GPIO32 = I2C - SDA GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 1; // GPIO33 = I2C - SCL GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0; // Enable pull-up for GPIO32 (SDAA) GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0; // Enable pull-up for GPIO33 (SCLA) EDIS; } void I2CA_Init(void) { I2caRegs.I2CMDR.bit.IRS = 0; // Reset the I2C module // I2C slave address register I2caRegs.I2CSAR = TMP100_SLAVE; // I2C 50Khz setting with TMS320F28035 60Mhz I2caRegs.I2CPSC.all = 5; I2caRegs.I2CCLKL = 95; I2caRegs.I2CCLKH = 95; I2caRegs.I2CMDR.bit.IRS = 1; // Take I2C out of reset } //=========================================================================== // End of SourceCode. //===========================================================================