|
|
View previous topic :: View next topic |
Author |
Message |
edbfmi1
Joined: 18 Jul 2006 Posts: 103
|
I2C 24LC16B Read/Write Question |
Posted: Thu Oct 05, 2006 10:29 am |
|
|
I am using the PCM compiler with a PIC16C73A micro.
I had to upgrade to the PIC16C73A from my original PIC because I ran out of memory. I know the PIC16C73A has a USART but I am mot able to take advantage of this due to backward compatibility. I am using the following pins for communication with the 24LC16B Eeprom:
SDA = Pin_B7
SCL = Pin_B6
I have written a simple subroutine to initialize the Eeprom with the following data:
Code: |
/*
Ram Location Value
11,12 11
13,14 21
15,16 31
17,18 41
21,22 12
23,24 22
25,26 32
27,28 42
31,32 13
33,34 23
35,36 33
37,38 43
. .
. .
. .
. .
91,92 19
93,94 29
95,96 39
97,98 49
*/
|
Below is the subroutines I use to accomplish this, (I have only included the subroutines in question and the pre-processor directives)
Code: |
#include <16C73A.h>
#device *=8
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=40000000)
#use I2C(master, SDA=PIN_B7, SCL=PIN_B6, fast=1000000)
#define EEPROM_SDA PIN_B7
#define EEPROM_SCL PIN_B6
void WriteEeprom(long int data, int loc)
{
output_float(EEPROM_SCL);
output_float(EEPROM_SDA);
{
I2C_START();
I2C_WRITE(160);
I2C_WRITE(loc);
I2C_WRITE(data); // Low Byte of data
I2C_WRITE(data>>8); // High byte of data
I2C_STOP();
delay_ms(20);
}
}
void ReadEeprom(long int data, int loc)
{
I2C_START();
I2C_WRITE(160);
I2C_WRITE(loc);
I2C_START();
I2C_WRITE(161);
data1 = I2C_READ();
data2 = I2C_READ(0);
I2C_STOP();
data2 = data2<<8;
preset1 = data2+data1;
}
void PresetEeprom()
{
ProgNumber = 1;
while (ProgNumber < 10)
{
delay_cycles(1);
location = ProgNumber*10;
location = location+1;
preset1 = ProgNumber + 10;
WriteEeprom((preset1),(location)); // WriteEepprom (data, location)
location = location+2;
preset1 = ProgNumber + 20;
delay_cycles(1);
WriteEeprom((preset1),(location));
location = location+2;
preset1 = ProgNumber + 30;
delay_cycles(1);
WriteEeprom((preset1),(location));
location = location+2;
preset1 = ProgNumber + 40;
delay_cycles(1);
WriteEeprom((preset1),(location));
ProgNumber++;
}
}
|
Everything works except it stores decimal 12327 instead of 39 at locations 95,96.
This is binary 0011000000100111 instead of 0000000000100111.
I can not figure out why it has 00110000 in the high byte instead of 00000000.
BTW, I do have external 10K pull ups on the SDA and SCL lines and I have tried a new Eeprom but it gives the same results.
Any helpful insight will be appreciated. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Oct 05, 2006 11:56 am |
|
|
Quote: | #include <16C73A.h>
#device *=8 // Don't need this line.
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=40000000) // 40 MHz is not correct
#use I2C(master, SDA=PIN_B7, SCL=PIN_B6, fast=1000000)
#define EEPROM_SDA PIN_B7
#define EEPROM_SCL PIN_B6 |
Your program has a large number of errors.
1. 8-bit pointers is the default for the 16C73A. You don't need that line.
2. You have the clock set for 40 MHz. Do you really have a 4 MHz
crystal ? If so, delete one of the 0's.
3. The 24LC16B SCL signal can run at a maximum speed of 400 KHz.
You have the speed set for 1 MHz. This will not work. The max
speed information is at the top of the first page of the 24LC16B data
sheet. You need to download the data sheet and read it.
http://ww1.microchip.com/downloads/en/DeviceDoc/21703F.pdf
Quote: | void ReadEeprom(long int data, int loc)
{
I2C_START();
I2C_WRITE(160);
I2C_WRITE(loc);
I2C_START();
I2C_WRITE(161);
data1 = I2C_READ();
data2 = I2C_READ(0); |
CCS already has a driver for the 24LC16B. It's in this folder:
c:\program files\picc\drivers\2416.c
If you look at that driver and the eeprom data sheet, you will see
that the address is 16-bits ('long int') and the data is 8-bits.
In your driver, you have it the opposite way. That won't work.
CCS has a driver. Use it. That way, you prevent this kind of bug
from happening. |
|
|
|
|
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
|