View previous topic :: View next topic |
Author |
Message |
Blackjackmaster
Joined: 14 May 2023 Posts: 30
|
TCA9548A |
Posted: Mon Jun 19, 2023 1:03 pm |
|
|
The only changes are the micro going from Arduino based system to using a PIC16F877A.
I have not looked into the I2C library that is being used for the Arduino code. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Mon Jun 19, 2023 1:07 pm |
|
|
The critical big difference between the Arduino, and a PIC is the
voltage that is accepted as a Vih on the I2C bus. The Arduino will
accept anything above 2.4v, the PIC (when running off 5v), needs
4v. This is why the voltage actually being applied to the pull-ups on
the PIC connection is vital. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
Re: TCA9548A |
Posted: Mon Jun 19, 2023 1:18 pm |
|
|
Blackjackmaster wrote: |
The only changes are the micro going from Arduino based system to using a PIC16F877A.
|
You still didn't tell us
1. The number of pull-up resistors you have installed. Do you have 19 ?
2. The value of the resistors.
3. The pull-up voltage on each resistor. |
|
|
Blackjackmaster
Joined: 14 May 2023 Posts: 30
|
TCA9548A |
Posted: Mon Jun 19, 2023 2:23 pm |
|
|
Hello,
There 4.7K Resistors (pullups) from the micro to the TCA and 5V on the SDA and SCL lines.
There 4.7K Resistors (pullups) on the output of SD0/SD1 on the TCA and 5V on the SDA and SCL lines.
The empty (unused) outputs on the TCA do not have resistors on them.
Reset line 10K to VCC
Status bit on TCA:
Stat: 01
ACK addr: E0
Thanks.... |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Mon Jun 19, 2023 5:06 pm |
|
|
add all the other pullups...
while YOU don't use them, having them 'float' could allow stray glitch to enter the device.
do you have bypass cap at the chips ? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Mon Jun 19, 2023 11:29 pm |
|
|
You talk about all the pull-ups going to 5v.
Yes the ADXL345 is a 3.3v device. It needs to be running off 3.3v, and
have pull-ups to 3.3v. |
|
|
Blackjackmaster
Joined: 14 May 2023 Posts: 30
|
TCA9548A |
Posted: Tue Jun 20, 2023 7:58 am |
|
|
The ADXL345 is a board from Adafruit and VIN is from 3.3V - 5.0V as it says it on the board. Logic is also 3.3V-5.0V
I will pull all the channels up to 5V even though I am not using them. |
|
|
Blackjackmaster
Joined: 14 May 2023 Posts: 30
|
TCA9548A |
Posted: Tue Jun 20, 2023 9:19 am |
|
|
Hello,
I pulled up the unused SDA/SCL ports on the TCA9548A. The channels are not switching. If I connect the ADXL to the PICF16F877A directly I can see the address 0xA6. I know the ADXL is working and the PIC16F877A.
I have changed out the TCA9548A with another one in case I damaged it, and it does the same thing. I put the part back into the Arduino circuit and works fine.
Any other suggestions? |
|
|
gaugeguy
Joined: 05 Apr 2011 Posts: 303
|
|
Posted: Tue Jun 20, 2023 9:31 am |
|
|
You are probably going to need to use SMBus mode on the 5V PIC so that it can properly read the lower voltage 3.3V I2C of the peripheral. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Wed Jun 21, 2023 12:32 am |
|
|
No, the TDA does level translation.
However I pointed out that the Arduino code is not talking to the address
he says the TDA is on. He never answered on this....
The Arduino is addressing it on 0xE0, not on 0xEE, which he claims it is
wired for.
This would mean that A0, A1 & A2 are actually pulled low, not high. |
|
|
Blackjackmaster
Joined: 14 May 2023 Posts: 30
|
TCA9548A |
Posted: Wed Jun 21, 2023 5:44 am |
|
|
A0,A1,A2 are pulled low on the Arduino board and the PIC16F877A board. The response Arduino is 0X70 and the response PIC is 0xE0. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Wed Jun 21, 2023 7:16 am |
|
|
So have you changed:
#define TCAaddr 0xEE
Needs to be 0xE0 or the TCA will not be addressed |
|
|
Blackjackmaster
Joined: 14 May 2023 Posts: 30
|
TCA9548A |
Posted: Wed Jun 21, 2023 8:22 am |
|
|
Code: | //#fuses HS
#FUSES NOWDT //No Watch Dog Timer
//#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPUT //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(crystal=20mHz)
#use rs232(baud=9600,parity=N,UART1,bits=8,stream=RS232,errors)
#use i2c(Master, slow,i2c1,force_hw)
unsigned int8 I2C_Address;
unsigned int8 status;
unsigned int8 Device_Count = 0;
int8 Channel;
#define TCAaddr 0xE0
const int8 bus_array[8]={1,2,4,8,16,32,64,128};
void select_bus(int bus)
{
if (bus > 7 )
return; //trap illegal bus numbers
I2C_start();
I2C_write(TCAaddr);
I2C_write(bus_array[bus]); //select specified bus number
I2C_stop(); //I2C bus now routes to BUS number
}
//Then with the ADXL wired as described above, simply call
// select_bus(0);
//And the ADXL will now be connected to the I2C bus with level
//translation.
//You then write to the ADXL as normal.
int8 get_ack_status(int8 address)
{
int8 ack;
i2c_start();
delay_us(20);
ack = i2c_write(address); // Status = 0 if got an ACK
i2c_stop();
delay_us(20);
if(ack == 0)
return(TRUE);
else
return(FALSE);
}
void Get_I2C_Addresses(void){
// Try all slave addresses from 0x10 to 0xEF.
// See if we get a response from any slaves
// that may be on the i2c bus.
// for(I2C_Address = 0x10; I2C_Address < 0xF0; I2C_Address+=2) // original
for(I2C_Address = 0x10; I2C_Address < 0xE8; I2C_Address+=2) // trimmed down to avoid scanning mux address, just in case
{
status = get_ack_status(I2C_Address);
printf("Stat: %X\n\r", status);
if(status == TRUE)
{
printf("ACK addr: %X\n\r", I2C_Address);
Device_Count++;
delay_ms(100);
}
}
if(Device_Count == 0){
printf("Nothing Found\n\r");
delay_cycles(1);
}
else{
printf("Found: %u\n\r", Device_Count);
delay_cycles(1);
}
}
//=================================
void main(){
output_float(PIN_B0);
output_float(PIN_B1);
for(Channel = 0; Channel < 8; Channel++)
{ // loop through channels
select_bus(bus_array[Channel]);
printf("\n\rTCA Port #%d\n\r",Channel);
Device_Count = 0;
Get_I2C_Addresses(); //I2C scanner
}
while(1);
}
|
Output when connected to PIC16F877A
Stat: 01
ACK addr: C0
Stat: 01
ACK addr: C2
Stat: 01
ACK addr: C4
Stat: 01
ACK addr: C6
Stat: 01
ACK addr: C8
Stat: 01
ACK addr: CA
Stat: 01
ACK addr: CC
Stat: 01
ACK addr: CE
Stat: 01
ACK addr: D0
Stat: 01
ACK addr: D2
Stat: 01
ACK addr: D4
Stat: 01
ACK addr: D6
Stat: 01
ACK addr: D8
Stat: 01
ACK addr: DA
Stat: 01
ACK addr: DC
Output when connected to TCA9548 SD0/SC0:
TCA Port #0
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 00
Stat: 01
ACK addr: E0
Stat: 00
Stat: 00
Stat: 00
Found: 1 |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Wed Jun 21, 2023 10:33 am |
|
|
You are using the select bus function incorrectly. The syntax is:
select_bus(Channel);
You are trying to tell it to select a bus that doesn't exist....
It uses the array internally to select the bus. Doesn't expect to
be called with the array value.... |
|
|
PrinceNai
Joined: 31 Oct 2016 Posts: 480 Location: Montenegro
|
|
Posted: Wed Jun 21, 2023 10:46 am |
|
|
That is my mistake then, he used it as I wrote it
Very nice catch, I will correct it in the code. |
|
|
|