View previous topic :: View next topic |
Author |
Message |
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
MCP3462 |
Posted: Mon Nov 11, 2019 5:21 am |
|
|
Hello everybody,
Has anyone had experience with MCP3462 devices?
I have tried all possible combinations and verified registers content but ADC result is always 0.
I know this is not the place for this question but it is a cry for help _________________ George.
Last edited by georpo on Mon Nov 11, 2019 6:06 am; edited 1 time in total |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Mon Nov 11, 2019 5:43 am |
|
|
You should post your test code. As an SPI device, you need the correct 'mode',speed, etc. althought you say you can access registers.
Maybe something 'silly'...
I don't have one to test but.. have you confirmed with a DVM that there IS a positive voltage AT the input terminal of the device ? It could be that pin is grounded, maybe by a solder whisker.
No amount of code will fix a grounded input pin
Jay |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Mon Nov 11, 2019 5:56 am |
|
|
Hi temtronic.
Thanks for taking the time to reply.
There is no soldering problem, already tried 2 ICs resoldered them and I am very good at it.
There is voltage at the input.
I also tried the internal temperature sensor with the same 0 output.
I also found another guy having the same problem:
[url]
https://www.microchip.com/forums/m1103547.aspx#1103547
[/url] _________________ George. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Mon Nov 11, 2019 7:24 am |
|
|
As Temtronic says, post some code. The unit can use SPI mode 0, or 3. Assuming you are running at 3.3v, any speed available on a normal PIC. |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Tue Nov 12, 2019 1:46 am |
|
|
Hello!
Here is the code.
Code: |
void FullReset(){
Select(EXTADC);
spi_read(0b01111000); //full reset
Select(NONE);
delay_ms(1);
}
void WriteConfiguration(){
Select(EXTADC);
spi_read(0b01000110); //Incremental write starting at 0x01 config0
spi_read(0b11100011); //Config0 Internall clock without output,Conversion mode
spi_read(0b01001100); //Config1 MCLK/2
spi_read(0b10001011); //Config2
spi_read(0b11110000); //Config3
spi_read(0b01110011); //IRQ
spi_read(0b00101000); //MUX select channel 2
spi_read(0b00000000); //SCAN MSB
spi_read(0b00010000); //SCAN
spi_read(0b00001111); //SCAN LSB
spi_read(0x00); //TIMER
spi_read(0x00); //TIMER
spi_read(0x00); //TIMER
Select(NONE);
}
uint8_t ReadIRQ(){
uint8_t IR=0;
Select(EXTADC);
spi_read(0b01010101); //read IRQ
IR=spi_read(0xFF);
Select(NONE);
return IR;
}
void ReadADC16b(){
uint8_t A=0,B=0,C=0,D=0;
Select(EXTADC);
spi_read(0b01000001); //Static Read ADCDATA register
A=spi_read(0xFF);
B=spi_read(0xFF);
C=spi_read(0xFF);
D=spi_read(0xFF);
Select(NONE);
printf(TX232,"%u,%u,%u,%u\n\r",A,B,C,D);
}
|
Code: |
void PIC_init(){
TRISA=0b0000000011000001;
TRISB=0b0100011000001000;
LATA=0;
LATB=0;
RPOR6 =0x0700; // RP13=SDO SPI data output
RPOR5 =0x0800; // RP11=SCK SPI clock output
RPINR20 =10; // RP10=SDI SPI data input
RPOR3 =0x0300; // RP7=U1TX
CNPU1=0b0001000100000000;
U1BRG=((32000000/2)/(4*115200))-1;
U1MODE=0b1000100000001000; //
U1STA =0b0000010100010000;
setup_spi(SPI_MASTER | SPI_SCK_IDLE_LOW | SPI_XMIT_L_TO_H | SPI_CLK_DIV_4 | SPI_SS_DISABLED);
}
void Main(){
uint16_t p=0;
PIC_init();
Select(NONE);
printf(TX232,"\fHello.\n\r");
FullReset();
delay_ms(100);
WriteConfiguration();
delay_ms(100);
while(1){
while(ReadIRQ()&0x40) delay_ms(1);
ReadADC16b();
delay_ms(100);
}
}
|
_________________ George. |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Tue Nov 12, 2019 2:31 am |
|
|
For anyone in my case,
Pin /IRQ needs to be configured as "The inactive state is logic High" or use a pull up even if you do not use it!
Wasted 2 days of my life.
_________________ George. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Tue Nov 12, 2019 2:46 am |
|
|
We have all been there....
One comment:
SPI_SS_DISABLED
Not wanted. It probably won't be doing any harm, but this command is for
a _slave_ chip only. Not for a master. I'd have to check what bits it actually
sets.
Second comment. Your writing to RPOR won't work. You cannot write to
these registers without performing an UNLOCK sequence first. Your writes
will be being ignored.
This is what #PIN_SELECT does for you. Generates the unlock sequence, sets
RPOR, and then re-locks the peripheral.
Read the sticky at the top of the forum on how to use PIN_SELECT.
If it is working, it is because the default values in the registers just
happen to match what you want. |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Tue Nov 12, 2019 3:45 am |
|
|
Dear Ttelmah,
About the SPI_SS_DISABLED, yes I know what it does.
Never used it in the past. This is the first time.
I have to tell you that the waveshare epaper 1.54" does not work if I do not put SPI_SS_DISABLED. I do not know why.
I compared the waveforms in the oscilloscope with and without SPI_SS_DISABLED, they are the same...
About the RPOR and RPINR of course it works. I never used CCS functions for setting remmapable peripheral I/O. I can assure you that it works!
Of course you have to define:
Code: | #word RPOR0=getenv("SFR:RPOR0") |
_________________ George. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Tue Nov 12, 2019 4:01 am |
|
|
Tell us what PIC.
For 99% (all I thought) of PIC's, the RPOR registers are protected. |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Tue Nov 12, 2019 4:18 am |
|
|
All Dspic or PIC24 devices I have used up to now.
DSPIC33FJ64GP802 for example.
PIC24FJ48GA002 in the current project.
It is not that case that the defaults just happen to fit what I randomly use.
I have designed several pcbs with these chips and each time the layout is according to the need and routing ease of the design. And by setting RPOR and RPINR I remap the peripherals.
This is the disassembly listing:
Code: |
129: RPOR6 =0x0700; // RP13=SDO SPI data output
1776 207004 mov.w #0x700,0x0008
1778 883664 mov.w 0x0008,0x06cc
130: RPOR5 =0x0800; // RP11=SCK SPI clock output
177A 208004 mov.w #0x800,0x0008
177C 883654 mov.w 0x0008,0x06ca
131: RPINR20 =10; // RP10=SDI SPI data input
177E 2000A4 mov.w #0xa,0x0008
1780 883544 mov.w 0x0008,0x06a8
132:
133: RPOR3 =0x0300; // RP7=U1TX
1782 203004 mov.w #0x300,0x0008
1784 883634 mov.w 0x0008,0x06c6
|
It just passes the values to the register address. _________________ George. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Tue Nov 12, 2019 5:01 am |
|
|
From the data sheet for this chip:
Quote: |
10.4.4.1 Control Register Lock
Under normal operation, writes to the RPINRx and
RPORx registers are not allowed. Attempted writes will
appear to execute normally, but the contents of the
registers will remain unchanged. To change these registers,
they must be unlocked in hardware. The register
lock is controlled by the IOLOCK bit (OSCCON<6>).
Setting IOLOCK prevents writes to the control
registers; clearing IOLOCK allows writes.
To set or clear IOLOCK, a specific command sequence
must be executed:
1. Write 46h to OSCCON<7:0>.
2. Write 57h to OSCCON<7:0>.
3. Clear (or set) IOLOCK as a single operation.
Unlike the similar sequence with the oscillator’s LOCK
bit, IOLOCK remains in one state until changed. This
allows all of the Peripheral Pin Selects to be configured
with a single unlock sequence, followed by an update
to all control registers, then locked with a second lock
sequence.
|
You are getting away with it because IOLOCK wakes up off, and the
CCS code is not setting it. However this is dangerous since it means
peripheral mappings can get accidentally changed. Much better to
have this feature locked. Use the CCS code. It can handle unlocking
and locking correctly. |
|
|
georpo
Joined: 18 Nov 2008 Posts: 281 Location: Athens, Greece.
|
|
Posted: Tue Nov 12, 2019 5:29 am |
|
|
I can not see how they can accidentally changed but I will follow your advice.
Thanks for the tip. _________________ George. |
|
|
jcc273
Joined: 24 Mar 2023 Posts: 1
|
|
Posted: Fri Mar 24, 2023 1:34 pm |
|
|
Oh man i could kiss you. I too wasted a couple days writing a linux driver for this part and combing it over and over and over to see what i was possibly missing then found your post, set the IRQ High and boom life was good again!!! Thank you so much for posting the solution back : ) |
|
|
|