View previous topic :: View next topic |
Author |
Message |
E_Blue
Joined: 13 Apr 2011 Posts: 417
|
I2C don't send any data |
Posted: Sun Mar 24, 2019 1:33 pm |
|
|
The compiler version is 5.078
PIC18F4520 DIP
The routine get stuck on the start()
I tried with RC3 & RC4 as input but didn't work either.
Code: |
#include <18F4520.h>
#device ADC=8
#use delay(clock=16M)
#use fast_io(ALL)
#fuses INTRC,NOWDT,NOLVP,BORV27
#use i2c(master, slow, I2C1,fast=400000)
void main()
{
setup_oscillator(OSC_16MHZ);
output_a(0);
output_b(0);
output_c(0);
output_d(0);
output_e(0);
set_tris_a(0);
set_tris_b(0);
set_tris_c(0);
set_tris_d(0);
set_tris_e(0);
i2c_init(100000);
while(1)
{
delay_ms(100);
i2c_start();
i2c_write(0x60);//address
i2c_write(PLL_W);
i2c_write(byte3_w);
i2c_write(byte4_W);
i2c_write(byte5_W);
i2c_stop();
}
}
|
I put two 1K resistances, one from RC3 to +V and from RC4 to +5V.
Any idea what can be happening?
I'm trying to control a TEA5767 Radio module. _________________ Electric Blue |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19359
|
|
Posted: Sun Mar 24, 2019 2:47 pm |
|
|
1K is a bit low. Many I2C devices only support 3mA drive (you don't say what
the device you are talking to is?). 3mA on 5v to meet the VOl requirement
is about 1500R.
Then you are specifying FAST_IO. This means that _you_ become responsible
for setting the TRIS correctly. You have the TRIS bits for your I2C bus
set to 0. Yet the data sheet says:
Quote: |
Selection of any I2C mode, with the SSPEN bit set,
forces the SCL and SDA pins to be open-drain,
provided these pins are programmed to inputs by
setting the appropriate TRISC bits. To ensure proper
operation of the module, pull-up resistors must be
provided externally to the SCL and SDA pins.
|
So the I2C bits need to be set as _inputs_ with their TRIS bits set to
'1'.
Then given we don't know the device, there is no guarantee that the
address being used is right. Use PCM_Programmers I2C scanner
program from the code library, and find if the device responds and on
what address, before trying your own code. |
|
![](templates/subSilver/images/spacer.gif) |
temtronic
Joined: 01 Jul 2010 Posts: 9170 Location: Greensville,Ontario
|
|
Posted: Sun Mar 24, 2019 3:08 pm |
|
|
I downloaded the datasheet for the device, first thinking it's a 5 volt PIC VS 3 volt device but...it should be OK...
However it's the device ADDRESS that caught my eye.
It's 1100 000n where n=0 for write, 1 for read. This means the actual address is 0xC0 NOT 0x60. Some think of I2C as 7 bit+r/w bit, so you need to shift left 1 bit position to get the 'real ' address. CCS typically uses the 8 bit address philosphy.
When you run PCMP's I2C scanner program it will confirm the device's address.
Whenever using I2C deices, ALWAYS run his program ! it's a quick, fast reliable test to be sure any I2C device is really there.
Also I'd get rid of the fast_io() and tris() functons and let the compiler do it all for you. Unless you are very,very careful, a simple misconfiguration of bits(fatfingeritis) will make you lose hours if not days wondering 'why doesn't it work?'
Jay |
|
![](templates/subSilver/images/spacer.gif) |
E_Blue
Joined: 13 Apr 2011 Posts: 417
|
|
Posted: Sun Mar 24, 2019 6:12 pm |
|
|
Thanks; I changed the resistor and commented FAST_IO(ALL) and start to work; I mean, I get data out from the pins(oscilloscope).
Now I can work in the code to make it work with the TEA5767.
UPDATE:
SUCCESS IT'S WORKING!
The 0xC0 address it's ok; now I will try to read at 0xC1. _________________ Electric Blue |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19359
|
|
Posted: Sun Mar 24, 2019 11:57 pm |
|
|
OK.
Make sure you add the keyword 'SMBUS' to your I2C setup.
With a 3.3v device, the lines won't go high enough to be seen as '1'
for the PIC I2C buffers. The SMBUS option reprograms these to the
lower SMBUS levels which are compatible with a 3.3v device. |
|
![](templates/subSilver/images/spacer.gif) |
E_Blue
Joined: 13 Apr 2011 Posts: 417
|
|
Posted: Tue Mar 26, 2019 12:44 am |
|
|
The device is running at 5V and as far I know the I2C uses open drains so the voltage swing is from 0 to resistor V+ that in this case is 5V.
The only thing that I note it is that the TEA5767 doesn't go to zero but instead 0.3V/0.4V; may be is the 20cm cable.
Anyway it's working now, the problem seems to have been the resistors. _________________ Electric Blue |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19359
|
|
Posted: Tue Mar 26, 2019 3:13 am |
|
|
No.
If you have your pull up resistors to 5v, the TEA5767, will be having it's inputs
'overvoltaged' by the pullups. It will probably clamp them to just over 3.3v
as it's internal protection kicks in, but this may well result in it's power
supply rail being raised by the I2C drive.
Dangerous.
The correct way to use a 3.3v device with a 5v PIC master, is to have the
pullups go to the 3.3v rail only, and switch the PIC to accept the lower
signalling voltage. Otherwise you risk chip damage.
No normal transistor actually pulls to 'zero'. The Vil spec for I2C, is 0.3*Vdd.
The Vol spec is 0.4v. So a device is meant to pull the signal down to 0.4v or
below, while the input will accept up to a volt (on 3.3v) as 'low'. |
|
![](templates/subSilver/images/spacer.gif) |
dluu13
Joined: 28 Sep 2018 Posts: 395 Location: Toronto, ON
|
|
Posted: Tue Mar 26, 2019 5:23 am |
|
|
Why not use a level converter chip? |
|
![](templates/subSilver/images/spacer.gif) |
temtronic
Joined: 01 Jul 2010 Posts: 9170 Location: Greensville,Ontario
|
|
Posted: Tue Mar 26, 2019 5:54 am |
|
|
I'm guessing he has a 'module' and not just the bare chip ? If a module, it might already have Logic Level converters onboard.
I downloaded the TEA datasheet and they don't explicitly say '3 volt only' operation, some operating specs are 5v. Kinda fuzzy, got this old guy confused, though these days I 'assume' all itty, bitty add-on black chips are 3 volt.
Jay |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Mar 26, 2019 6:52 am |
|
|
dluu13 wrote: | Why not use a level converter chip? |
With a 5v PIC, all you need to do is enable SMbus, which is a parameter
in the #use i2c() statement, and then use 3.3v on 3.3K pullups.
It's cheaper to do it that way, and it's completely acceptable electronically,
compared to using level converters. |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19359
|
|
Posted: Tue Mar 26, 2019 7:07 am |
|
|
Absolutely/exactly.
Exception is if you have one of the (rare) PIC's that doesn't have the SMBUS
option. |
|
![](templates/subSilver/images/spacer.gif) |
temtronic
Joined: 01 Jul 2010 Posts: 9170 Location: Greensville,Ontario
|
|
Posted: Tue Mar 26, 2019 2:33 pm |
|
|
I actually ordered a small PIC and wondered WHY the Timer interrupt didn't work...didn't even compile...
DOH.
THAT PIC doesn't HAVE an interrupt !!
After 25 years of playing with PICs, it never occoured to me they'd make a PIC without a timer interrupt.
Man I gotta printout and READ the datasheets not just scan online.... |
|
![](templates/subSilver/images/spacer.gif) |
|