|
|
View previous topic :: View next topic |
Author |
Message |
ntrungtruc2003
Joined: 16 Feb 2011 Posts: 42
|
i2c problem |
Posted: Sun Sep 11, 2011 1:30 am |
|
|
Dear Sir.
I am a newbie.
I posted this thread last month.
http://www.ccsinfo.com/forum/viewtopic.php?t=45691&start=0
With helping of Ttelmah I comunicated with TSL2561T light digital sensor, read true values of ID, Time registers. But can not read true values of C,D,E,F registers.
Following TSL2561 datasheet.
"
The ADC channel data are expressed as 16-bit values spread across two registers. The ADC channel 0 data
registers, DATA0LOW and DATA0HIGH provide the lower and upper bytes, respectively, of the ADC value of
channel 0. Registers DATA1LOW and DATA1HIGH provide the lower and upper bytes, respectively, of the ADC
value of channel 1. All channel data registers are read-only and default to 00h on power up
REGISTER ADDRESS BITS DESCRIPTION
DATA0LOW Ch 7:0 ADC channel 0 lower byte
DATA0HIGH Dh 7:0 ADC channel 0 upper byte
DATA1LOW Eh 7:0 ADC channel 1 lower byte
DATA1HIGH Fh 7:0 ADC channel 1 upper byte
"
CCS compiler V4.018
I can not read the value of Ch,Dh,Eh,Fh registers at the same time. For example in the following code the values of Dh, Fh registers changed with lux. The values of Ch, Eh register is alway FF.
Code: |
#include <16F877A.h>
#use delay(clock=8000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP
#include "tsl2561t.c"
#include "LCD_TM.c"
void main(void)
{
BYTE C0;
BYTE C1;
BYTE C2;
BYTE C3;
lcd_init();
Init_TSL2561();
Write_TSL2561(0x80,0x03); //Power up
//P=Read_TSL2561(0x80);
delay_ms(40);
while(true)
{
C0=Read_TSL2561(0x8C); //ADC channel 0 lower byte
lcd_gotoxy(1,1);
printf(lcd_putc,"%02X",C0);
C1=Read_TSL2561(0x8D); //ADC channel 0 higher byte
lcd_gotoxy(4,1);
printf(lcd_putc,"%02X",C1);
C2=Read_TSL2561(0x8E); //ADC channel 1 lower byte
lcd_gotoxy(1,2);
printf(lcd_putc,"%02X",C2);
C3=Read_TSL2561(0x8F); //ADC channel 1 higher byte
lcd_gotoxy(4,2);
printf(lcd_putc,"%02X",C3);
delay_ms(500);
}
} |
tsl2561.c file
Code: | #define TSL2561_SDA PIN_C4
#define TSL2561_SCL PIN_C3
#use i2c(master,low, sda=TSL2561_SDA, scl=TSL2561_SCL)
#include <math.h>
void Init_TSL2561()
{
output_float(TSL2561_SCL);
output_float(TSL2561_SDA);
}
void Write_TSL2561(byte address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0x52);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0x52);
while(status==1)
{
i2c_start();
status=i2c_write(0x52);
}
}
//==========================
// read data one byte from DS1307
//==========================
BYTE Read_TSL2561(byte address)
{
BYTE data;
i2c_start();
i2c_write(0x52);
i2c_write(address);
i2c_start();
i2c_write(0x53); //can not write data to TSL2561
//delay_ms(40);
data=i2c_read();
i2c_stop();
return(data);
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Sep 11, 2011 1:14 pm |
|
|
Quote: |
I can not read the value of Ch,Dh,Eh,Fh registers at the same time. For
example in the following code the values of Dh, Fh registers changed with
lux. The values of Ch, Eh register is alway FF.
//==========================
// read data one byte from DS1307
//==========================
BYTE Read_TSL2561(byte address)
{
BYTE data;
i2c_start();
i2c_write(0x52);
i2c_write(address);
i2c_start();
i2c_write(0x53); //can not write data to TSL2561
//delay_ms(40);
data=i2c_read();
i2c_stop();
return(data);
}
|
1. The comment is incorrect. You're not reading a DS1307.
2. The last i2c_read() must do a NACK. In CCS this is done by using
a parameter of 0x00. Example:
They show the NACK in the TSL2561 data sheet in Figures 13 and 15 on
page 12, but they show it in a very poor way. In the little box that says
"A" at the end of the last data byte read, they put a "1" below the box.
I would do it a better way. I would put a "N" in the box to show that a
NACK is required. |
|
|
ntrungtruc2003
Joined: 16 Feb 2011 Posts: 42
|
|
Posted: Tue Sep 13, 2011 9:49 pm |
|
|
Thanks you so much. I am very happy, it works smoothly. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|