|
|
View previous topic :: View next topic |
Author |
Message |
BartDelboo
Joined: 26 Feb 2018 Posts: 5
|
I2C problems with PIC18F47K42 |
Posted: Mon Feb 26, 2018 4:25 am |
|
|
Hello
I am having trouble with using the I2C HW of a pic18F47K42. If i use FORCE_SW, everything works. I am using following to configure the I2C:
Code: |
//Select I2C with PPS
#PIN_SELECT SCL1IN = PIN_C3
#PIN_SELECT SCL1OUT = PIN_C3
#PIN_SELECT SDA1IN = PIN_C4
#PIN_SELECT SDA1OUT = PIN_C4
#use i2c(Master,Slow,I2C1,FORCE_HW)
|
I tried I2C with the XC8 compiler and the MCC (microchip code generator). This works, so i am sure that my chip is working OK.
Somebody that knows what i am doing wrong?
I tried to do following, but with no success:
- Set pins as open drain.
- Set them as input or as output
- Using I2C1 or define pins again in #use i2c
Thanks in advance. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19549
|
|
Posted: Mon Feb 26, 2018 6:25 am |
|
|
I would use this:
Code: |
//Select I2C with PPS
#PIN_SELECT SCL1 = PIN_C3
#PIN_SELECT SDA1 = PIN_C4
//Using the peripheral name always forces hardware
#use i2c(Master,Slow=100000,I2C1)
|
You only need to map separate in/out functions, where these are separate paths on the same peripheral. I don't think these are separate on this peripheral, and the SCL in, is for the slave device only. |
|
|
BartDelboo
Joined: 26 Feb 2018 Posts: 5
|
|
Posted: Mon Feb 26, 2018 7:40 am |
|
|
Ok, i tried the code you suggested, but still no activity at all on the I2C bus.
If i look with my scope, i see that SDA and SCL lines remain high.
Some other ideas? Someone already tested I2C with this type of PIC (18F47K42)?
I find it strange that FORCE_SW and XC8 compiler work. Can it be that there is a fault in the compiler or the PIC header file?
Thanks! |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9245 Location: Greensville,Ontario
|
|
Posted: Mon Feb 26, 2018 7:51 am |
|
|
Simple to see, just dump both the listings of the compiled code, and compare. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19549
|
|
Posted: Mon Feb 26, 2018 9:16 am |
|
|
I suggest you ask CCS. This is very much a beta chip at present. The current compiler is the first listing it.....
It's only just been added to the devices supported list.
MicroChip always have the advantage of writing the compiler before the chips are released. CCS have to wait till they are given data to start.
Talk to them nicely, and they will probably give you an example.
They do show SDA in and out as two separate mappings, so I'd actually expect it to need:
Code: |
//Select I2C with PPS
#PIN_SELECT SCL1 = PIN_C3
#PIN_SELECT SDA1IN = PIN_C4
#PIN_SELECT SDA1IOUT = PIN_C4
//Using the peripheral name always forces hardware
#use i2c(Master,Slow=100000,I2C1)
|
I'd also be explicitly ensuring the analog is off on those pins, and that the timer2 input is disabled. |
|
|
jartur32
Joined: 24 Feb 2014 Posts: 10
|
Jartur |
Posted: Mon Dec 10, 2018 6:06 pm |
|
|
Hello BartDelboo, could you check this way, maybe works with the PIC18F47K42 ?
Code: |
// Active the fast io
#use fast_io(c)
// Define your pin names
#define SCL_PIN PIN_C3
#define SDA_PIN PIN_C4
// I2C declaration code
#pin_select SCL1OUT = SCL_PIN
#pin_select SCL1IN = SCL_PIN
#pin_select SDA1OUT = SDA_PIN
#pin_select SDA1IN = SDA_PIN
#use i2c( MASTER, FAST, I2C1, FORCE_HW )
// init funtion add this line to active the open drain
// and use this pin like inputs
void init(void)
{
set_tris_c(0b00011000); // SDA and SCL like input
set_open_drain_c(0b00011000); // SDA and SCL like open drain
output_c(0x00);
}
void main(void)
{
do{
// code
}while(TRUE); // Infinite loop
}
|
Let me know your result test, and have a good day. |
|
|
dluu13
Joined: 28 Sep 2018 Posts: 395 Location: Toronto, ON
|
|
Posted: Tue Dec 11, 2018 8:00 am |
|
|
I have also had this happen with v5.078 with PIC16F1939 and PIC16F19175. It only worked after I added the FORCE_SW option. It did not work if I specified FORCE_HW or left it blank. One difference is that I did not use I2C1/I2C2, and instead specified the SCL and SDA pin separately. I never bothered to try and fix it though.
The thing is I'm a bit fuzzy on the details and I don't have the hardware set up anymore to test it out.
On PIC24FJ128GA204, with v5.078 of CCS, I don't have any issues with using the hardware module with #use i2c. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19549
|
|
Posted: Tue Dec 11, 2018 10:02 am |
|
|
It appears that for this particular chip, the routines to actually talk to the I2C
hardware are missing!...
The #PIN_SELECT, is working fine (walked through and checked the
registers all OK).
However when you call any I2C routine setup to use the hardware, no code
is being generated.....
Code: |
....................
.................... i2c_start(ROM);
.................... i2c_write(ROM,0xA0);
.................... i2c_write(ROM,0);
.................... i2c_write(ROM,0xA1);
.................... test=i2c_read(ROM);
00076: MOVFF 00,test
.................... i2c_stop(ROM);
|
The only line that generates anything is the I2C_read, and this only zero.
It appears that the device database (at least here), does not know about the
peripheral. Yet the #USE does.
So no code bodges work. |
|
|
soonc
Joined: 03 Dec 2013 Posts: 215
|
Re: I2C problems with PIC18F47K42 |
Posted: Wed Feb 13, 2019 4:32 pm |
|
|
BartDelboo wrote: | Hello
I am having trouble with using the I2C HW of a pic18F47K42. If i use FORCE_SW, everything works. I am using following to configure the I2C:
Code: |
//Select I2C with PPS
#PIN_SELECT SCL1IN = PIN_C3
#PIN_SELECT SCL1OUT = PIN_C3
#PIN_SELECT SDA1IN = PIN_C4
#PIN_SELECT SDA1OUT = PIN_C4
#use i2c(Master,Slow,I2C1,FORCE_HW)
|
I tried I2C with the XC8 compiler and the MCC (microchip code generator). This works, so i am sure that my chip is working OK.
Somebody that knows what i am doing wrong?
I tried to do following, but with no success:
- Set pins as open drain.
- Set them as input or as output
- Using I2C1 or define pins again in #use i2c
Thanks in advance. |
I'm using the PIC18F46K42 and 47K42... using I2C2 or FORCE_HW does not work. Using the pins does work.
Remember to use the hardware you should be using the
i2c_transfer() and not the old style code.
#define SCL_PIN PIN_B1 // using SCL2
#define SDA_PIN PIN_B2 // using SDA2
#pin_select SCL2OUT = SCL_PIN
#pin_select SDA2OUT = SDA_PIN
//#use i2c(MASTER, I2C2) // Does not work
//#use i2c(MASTER, scl=SCL_PIN, sda=SDA_PIN, FORCE_HW) // not working
#use i2c(MASTER, scl=SCL_PIN, sda=SDA_PIN, FAST) Works ! |
|
|
|
|
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
|