CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

PIC18F46K42 I2C

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
GL82



Joined: 12 Jun 2019
Posts: 15

View user's profile Send private message

PIC18F46K42 I2C
PostPosted: Fri May 27, 2022 8:11 am     Reply with quote

Hi all!
I have to change from PIC18F46Q10 to PIC18F46K42 and now I2C old functions do not work in this micro so I must use the i2c_transfer() function.

I had this code working on the PIC18F46Q10

Code:
void setVoltageE2PROMDAC(int16 valorDAC)
{
    int8 dato=0;
   
    i2c_start(DAC);            // Issues a start command
    i2c_write(DAC,0xC0);         // byte over the I2C interface. Address byte
    i2c_write(DAC, 0x60);         // byte over the I2C interface. E2PROM write
    dato=valorDAC>>4;
    i2c_write(DAC, dato);         // byte over the I2C interface. Data byte
    dato=(valorDAC&0x00FF)<<4;
    i2c_write(DAC, dato);         // Sends a single byte over the I2C interface.
    i2c_stop(DAC);             // Issues a stop command


I have changed this code to the following one but it is not working

Code:
void setVoltageE2PROMDAC(int16 valorDAC)
{
    int8 dato[3];
   
    dato [0] = 0x60;
    dato [1] = valorDAC>>4;
    dato [2] = (valorDAC&0x00FF)<<4;
    i2c_transfer(DAC,0xC0,dato,3);         //
}


The use i2c is the same in both codes
Code:
#use i2c(STREAM=DAC, master, FAST=800000,SCL=PIN_C3,SDA = PIN_C4,FORCE_HW) 


What am I doing wrong?
Ttelmah



Joined: 11 Mar 2010
Posts: 19515

View user's profile Send private message

PostPosted: Fri May 27, 2022 8:27 am     Reply with quote

Are you PPS mapping the pins (#PIN_SELECT)?. You need to. Look at the
sticky at the top of the forum on how to do this. On _some_ chips (a very
few), some peripherals will map without using #PIN_SELECT, but it is
safer to always use this.
Seriously 800000 bps, is above the speed that I2C can safely run, unless
you have active pull-ups. Do you have these?. It may well be that on the
other chip the compiler was automatically limiting you to 400000Hz,
since this is the maximum actually supported by the peripheral.
Other thing you need to turn off slew rate limiting on the pins for this.
This defaults to enabled.
GL82



Joined: 12 Jun 2019
Posts: 15

View user's profile Send private message

PostPosted: Fri May 27, 2022 8:36 am     Reply with quote

Thanks for the reply Ttelmah!
The #pin select is the same in both PICs
Code:
#pin_select SCL1OUT = PIN_C3
#pin_select SCL1IN  = PIN_C3
#pin_select SDA1OUT = PIN_C4
#pin_select SDA1IN  = PIN_C4


I have 2.2K pull-ups, the hw is the same, I have only change the PIC and I achieve this speed (even faster speeds) with this hw.

I have studied both signals with an oscilloscope and the clock signal is ok at 800kHz but SDA signal is only doing the start command and one bit more.

I have tried to do it in slow speed and the result is the same.
temtronic



Joined: 01 Jul 2010
Posts: 9228
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Fri May 27, 2022 9:15 am     Reply with quote

Had a look at the specs...
Mr T is right (as always), you CANNOT go faster than 400KHz UNLESS you use 'active pullups'.

Just because the scope 'sees' some signals does NOT mean the peripheral / PIC WILL function 100% at that speed.
GL82



Joined: 12 Jun 2019
Posts: 15

View user's profile Send private message

PostPosted: Sat May 28, 2022 1:05 am     Reply with quote

Thanks for the advice temtronic.
However, as I said in my last post, if I try with lower speed (see the code below) the result is the same

Code:
#use i2c(STREAM=DAC, master, SLOW,SCL=PIN_C3,SDA = PIN_C4,FORCE_HW) 


Where could be the problem? the change to the new i2c functions looks easy but it is not doing the same
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sat May 28, 2022 1:45 am     Reply with quote

GL82 wrote:

If I try with lower speed (see the code below) the result is the same

I hope you didn't put it back to 800K. Keep it at SLOW for now.

GL82 wrote:

Where could be the problem? the change to the new i2c functions looks easy but it is not doing the same

What's the part number of the i2c slave device ?
Also what's your compiler version ?
What's the Vdd voltage of the Master PIC ?
What's the voltage on the 2.2K pull-ups ?
temtronic



Joined: 01 Jul 2010
Posts: 9228
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sat May 28, 2022 5:19 am     Reply with quote

Have to agree use 'SLOW' until you get the program to work, THEN if needed, you can increase the speed but NOT beyond the maximum in the spec sheet.


Since I don't use that PIC, is the 'I2C peripheral' the old style MSSP version or a newer 'stand alone I2C' style ? I've read here there are differences in how to setup the two. I'm assuming it's 'old' as no one else has asked though.

As others have asked ,VDD is important, I2C pullups and of course WHAT is the external device ? It may have 'special' power requirements, a 'rigid' setup routine, details we need to know to further help you.
Ttelmah



Joined: 11 Mar 2010
Posts: 19515

View user's profile Send private message

PostPosted: Sat May 28, 2022 10:10 am     Reply with quote

He should use the standard syntax for setting up the port. Don't use the
pin numbers in the setup. Use:
Code:

#pin_select SCL1OUT = PIN_C3
#pin_select SCL1IN  = PIN_C3
#pin_select SDA1OUT = PIN_C4
#pin_select SDA1IN  = PIN_C4

#use i2c(STREAM=DAC, master, FAST=400000, I2C1) 


Using this syntax makes the compiler automatically turn off slew rate
limiting on the port, and set the pins to open collector mode.
2K2 would only support a bus with just under 200pF capacitance even
at 400K (assuming 3.3v).

However I would explicitly set the slew rate. I've seen several chips
where this is not set by default by the compiler, and if this was wrong,
there would be signals, the edges just would be much too slow to work.

Remember also the compiler expects to see the chip NACK the address
byte. If this is not seen the transaction will abort.
GL82



Joined: 12 Jun 2019
Posts: 15

View user's profile Send private message

PostPosted: Mon May 30, 2022 6:35 am     Reply with quote

Hi all,
I have solved the issue. It was about the i2c configuration module. It seems that using fast/slow (and not setting the clock source) is not correct with the new i2c specific module. I have deleted it and added the clock source and configured it to work at 41.5 KHz. Now everything works fine. If I configure it up to 400 KHz it keeps working fine.

Code:
#use i2c(STREAM=DAC,master,CLOCK_SOURCE = TMR4,CLOCK_DIVISOR=4,SCL =PIN_C3,SDA=PIN_C4,FORCE_HW)


Thanks to everybody in this post!
Ttelmah



Joined: 11 Mar 2010
Posts: 19515

View user's profile Send private message

PostPosted: Mon May 30, 2022 9:20 am     Reply with quote

I'd have expected you to have seen clocks, but much too fast. The default
clock is Fosc/4. The I2C module does not have any BRG (unlike the SSP),
so should have defaulted to generating a clock at your Fosc/16 or Fosc/20.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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