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

ADC to SPI communication
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
BM92



Joined: 04 Oct 2013
Posts: 18

View user's profile Send private message

ADC to SPI communication
PostPosted: Fri Oct 04, 2013 7:31 am     Reply with quote

I have recently started a project which is requiring me to use a ADS1601 and a p24FJ128GA010. I have to communicate between these two devices but am very new to programming pics and ADC's.

I understand that to initialize the ADC a pulse sync needs to be sent but cannot find any examples of this. The PIC i will be using will be a slave. WIll the following code initialize the external ADC or the internal:

Code:
void initADC( int amask)
{   
   AD1PCFG = amask;
   AD1CON1 = 0x00E0;             
   AD1CSSL = 0;                
   AD1CON2 = 0;               
   AD1CON3 = 0x1F3F;             
   AD1CON1bits.ADON = 1;
}
temtronic



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

View user's profile Send private message

PostPosted: Fri Oct 04, 2013 8:33 am     Reply with quote

As there are no other 'hits' for the ADS1601, I suggest you download the datasheet and grab some graph paper. Consult the datasheet and 'set' the appropriate bits in the required registers using the graphpaper.Then you can convert the binary information into hex( if you want).
It's far easier to understand 'configuration' setups in binary for me.Far easier to see if a bit has been incorrectly set/cleared.
I don't have the time to download the ADS1601 datasheet and 'play computer'. I also don't have any hardware to test the 'configuration' to verify that it is correct.

A key part of being a tech is to read,code,test and repeat as required.

hth
jay
BM92



Joined: 04 Oct 2013
Posts: 18

View user's profile Send private message

PostPosted: Fri Oct 04, 2013 8:46 am     Reply with quote

Thanks for the reply. I have looked at the datasheet but not much is given on the configuration as far as i can tell. Sorry if it seems like i am simply looking for an answer but this is a project which has been given to me and i have no pic or ADC knowledge so far.

I understand how to configure different control registers etc but was not sure how to initialize the ADC. Even a guide on this would be very useful as i have searched the internet for days and simply do not know where to start.
temtronic



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

View user's profile Send private message

PostPosted: Fri Oct 04, 2013 9:16 am     Reply with quote

Well I'm NOT impressed with TI's datasheet either ! Not ONE sentence, let alone paragraph on HOW to configure the ADC!

Given the dismal lack of 'details', I strongly suggest you get another ADC, one with clear ,concise information on how to configure it.

Also 16bit ADCs MUST have supply well designed PCBs to be useful!! Board layout, decoupling, trace widths, etc. are CRITICAL. NOT for the beginner. even 12bit ADCs are 'fun' to get working 90%, let alone 100%.

You'll also find the '24' series of PICs don't have a lot of 'support' here. Most guys use the 16 and 18 series, so there's TONS of help for them.

Since you're new to PICs, please consider something easier, like the PIC18F46K22.Tons of goodies inside(2 UARTS,ADC,memory,etc) and well known on this forum. I consider it the 'Swiss army knife' of PICs.

However , if you're stuck using that ADC, contact TI and get some real details! 18 pages of 'analog' info doesn't help on the digital side of things !!

hth
jay
BM92



Joined: 04 Oct 2013
Posts: 18

View user's profile Send private message

PostPosted: Fri Oct 04, 2013 9:36 am     Reply with quote

temtronic wrote:
Well I'm NOT impressed with TI's datasheet either ! Not ONE sentence, let alone paragraph on HOW to configure the ADC!

Given the dismal lack of 'details', I strongly suggest you get another ADC, one with clear ,concise information on how to configure it.

Also 16bit ADCs MUST have supply well designed PCBs to be useful!! Board layout, decoupling, trace widths, etc. are CRITICAL. NOT for the beginner. even 12bit ADCs are 'fun' to get working 90%, let alone 100%.

You'll also find the '24' series of PICs don't have a lot of 'support' here. Most guys use the 16 and 18 series, so there's TONS of help for them.

Since you're new to PICs, please consider something easier, like the PIC18F46K22.Tons of goodies inside(2 UARTS,ADC,memory,etc) and well known on this forum. I consider it the 'Swiss army knife' of PICs.

However , if you're stuck using that ADC, contact TI and get some real details! 18 pages of 'analog' info doesn't help on the digital side of things !!

hth
jay


At least there is a reason i seem to be struggling. These were the two devices i was specifically told to use which is very annoying as it seems to be making it very difficult for me. I completely understand the theory of how the SPI and ADC should work together but i cannot seem to get any information regarding this ADC at all

Thanks,
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Oct 04, 2013 10:57 am     Reply with quote

temtronic wrote:
Well I'm NOT impressed with TI's datasheet either ! Not ONE sentence, let alone paragraph on HOW to configure the ADC!

http://www.ti.com/lit/ds/symlink/ads1601.pdf
The ads1601 data sheet has initialization information in these sections:

Page 8: see "Figure 1. Initialization Timing".

Page 19: Explains that you must send a SYNC pulse as shown in Figure 1.

The ads1601 is a read-only device. You can't write any configuration
bytes to it. It doesn't have a DIN pin. It only has a DOUT pin.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

Re: ADC to SPI communication
PostPosted: Fri Oct 04, 2013 11:11 am     Reply with quote

BM92 wrote:

The PIC i will be using will be a slave. WIll the following code initialize the external ADC or the internal:

void initADC( int amask)
{
AD1PCFG = amask;
AD1CON1 = 0x00E0;
AD1CSSL = 0;
AD1CON2 = 0;
AD1CON3 = 0x1F3F;
AD1CON1bits.ADON = 1;
}


That code has absolutely nothing to do with talking to the external ads1601
chip at all. The A/D module inside the PIC is a completely separate
entity from the external ads1601 chip. The PIC must get data from the
ads1601 by using the digital interface signals of SCLK, DOUT, FSO, and SYNC.

My understanding is that you are a complete newbie. I don't know who
gave you this project, I assume maybe a teaching assistant in a lab class.
I would never give components this complex to a newbie. I would have
the newbie start with maybe a 16F887 or 18F4620, and learn how to use
the internal 10-bit A/D converter. That would make sense.
temtronic



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

View user's profile Send private message

PostPosted: Fri Oct 04, 2013 11:25 am     Reply with quote

Man BIG confusion is thinking this IS an SPI device ! Well, at least a 'regular' SPI device...though TI does say '3 wire inteface', you need the 4th wire(FSO) to sync the data, so you have to treat it as NOT an SPI device. Once you get your head straight on that, a simple bitbanging driver should 'talk' to it Ok...

cheers
jay
BM92



Joined: 04 Oct 2013
Posts: 18

View user's profile Send private message

Re: ADC to SPI communication
PostPosted: Fri Oct 04, 2013 1:11 pm     Reply with quote

PCM programmer wrote:
BM92 wrote:

The PIC i will be using will be a slave. WIll the following code initialize the external ADC or the internal:

void initADC( int amask)
{
AD1PCFG = amask;
AD1CON1 = 0x00E0;
AD1CSSL = 0;
AD1CON2 = 0;
AD1CON3 = 0x1F3F;
AD1CON1bits.ADON = 1;
}


That code has absolutely nothing to do with talking to the external ads1601
chip at all. The A/D module inside the PIC is a completely separate
entity from the external ads1601 chip. The PIC must get data from the
ads1601 by using the digital interface signals of SCLK, DOUT, FSO, and SYNC.

My understanding is that you are a complete newbie. I don't know who
gave you this project, I assume maybe a teaching assistant in a lab class.
I would never give components this complex to a newbie. I would have
the newbie start with maybe a 16F887 or 18F4620, and learn how to use
the internal 10-bit A/D converter. That would make sense.


You got that right. This is my first project i have ever done involving pic's and SPI's so i am struggling to get my head around it. All i have been told is to set up the communication between the PIC an ADC using an SPI interface and its all a little baffling to me.

Also, like i said i did have a feeling that the code i gave was for the internal ADC and not the external one. Seems i was correct

So far i know that the first thing i need to do is initialize the ADC. Finding an example or guide on how to do this is proving difficult.

Also, thanks for all the replys
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Oct 04, 2013 3:53 pm     Reply with quote

I was looking at this some more, and I realized the ads1601 is the master.
It produces SCLK, DOUT, and FSO. So the 24F PIC must be the slave.

In the MSSP section of the 24FJ128GA010 data sheet, it shows a block diagram:
FIGURE 15-8: SPI SLAVE, FRAME SLAVE CONNECTION DIAGRAM

There isn't very much information on that mode in the data sheet.
They refer you to the 24F Reference Manual:
http://ww1.microchip.com/downloads/en/DeviceDoc/39699b.pdf

The timing diagrams show that it is probably possible to do this project
with the 24FJ128GA010 by putting it in "SPI slave, Frame slave" mode.
It looks like it fits the timing of the ads1601's output signals.
But I don't have the PCD compiler so I can't really help too much.
BM92



Joined: 04 Oct 2013
Posts: 18

View user's profile Send private message

PostPosted: Fri Oct 04, 2013 4:18 pm     Reply with quote

PCM programmer wrote:
I was looking at this some more, and I realized the ads1601 is the master.
It produces SCLK, DOUT, and FSO. So the 24F PIC must be the slave.

In the MSSP section of the 24FJ128GA010 data sheet, it shows a block diagram:
FIGURE 15-8: SPI SLAVE, FRAME SLAVE CONNECTION DIAGRAM

There isn't very much information on that mode in the data sheet.
They refer you to the 24F Reference Manual:
http://ww1.microchip.com/downloads/en/DeviceDoc/39699b.pdf

The timing diagrams show that it is probably possible to do this project
with the 24FJ128GA010 by putting it in "SPI slave, Frame slave" mode.
It looks like it fits the timing of the ads1601's output signals.
But I don't have the PCD compiler so I can't really help too much.


Yes thats correct the PIC should be in slave mode. I understand the theory of how each step should work but as i am not entirely familiar with the coding i am struggling to produce a code which does what i want.

Is there any books, guides or websites which may help me with this project?

I appreciate all of the help and the time you spent looking at this.
temtronic



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

View user's profile Send private message

PostPosted: Fri Oct 04, 2013 7:22 pm     Reply with quote

Man, it's still one ugly project !!
I tried 'googling', and there isn't a whole lot about it, sigh...
Have to ask, do you have some kind of prototyping PCB for testing?
Maybe a 'demo' kit from TI? Layout/noise will be an 'issue'.
If you can't get what PCM P was saying to work(seems sketchy.,well uncommon...) I'd run a 20MHz clock(same as PIC ?) into it and use the FSO output as an input to an interrupt to 'sync' the data.In the ISR,check 'sclk' and 'data' for hi/lo and build up the incoming data stream into 16 bits.I know 'timing' is critical and maybe the 'internal SPI peripheral' of the PIC will do the same job. sclk could be a 2nd interrupt, for proper timing ?
Kind of like making an 'old school' bit-banged UART....

just another way to look at it...


hth
jay
Ttelmah



Joined: 11 Mar 2010
Posts: 19537

View user's profile Send private message

PostPosted: Fri Oct 04, 2013 11:57 pm     Reply with quote

If you look at P22 of the data sheet, Texas are careful to point out the need for really good PCB design/layout.

It is an ugly chip, and the PIC is not going to be doing much else. The lack of data, is because there is literally nothing to do. You pulse 'sync' once after power up, to start the chip, and it then just continuously sends you data, with a separate sync pulse to tell you when the readings start..
This sync, would ideally go to the slave select on the PIC,
The big question is what one hopes to 'do' with the data. It is generating MB/sec of output, and putting it somewhere fast enough, is going to be the problem, Given the small amount of RAM on the PIC, and the amounts involved, it'd be much more suited to a processor with a lot more RAM.

It is not a project to be started without at least some experience in analog design, and some understanding of both the capabilities and limitations of particular processor families....

Best Wishes
BM92



Joined: 04 Oct 2013
Posts: 18

View user's profile Send private message

PostPosted: Sun Oct 06, 2013 5:52 am     Reply with quote

Thanks for the help.

If i am using a SPI slave, framed slave setup would the synchronisation pulse be sent automatically when data is being sent or do i have to code a synchronizing pulse to happen before the data is transmitted to the SPI
temtronic



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

View user's profile Send private message

PostPosted: Sun Oct 06, 2013 6:38 am     Reply with quote

After looking at the SPI datasheet...it seems you'll have 'fun' trying to read in 16 bits of data into the 8 bit SPI peripheral.It naturally would require 2 operations and doesn't appear to be 'programmer friendly'.
I still don't see how the ADC is a real 'SPI' device,more a 3 wire device.
Honestly, if you're stuck using this ADC, consider the old school 'bit banging' approach.
Use the ADC's FSO pin to trigger an interrupt.Inside the ISR read the DOUT pin while counting SCLK transitions, building up a 16 bit variable.
This approach will work and should maybe take 2-3 hours to get it 'up and running'.Once you're OK with the data coming back, then _maybe_ see if you can get the internal SPI of the PIC to work.

It boils down to how much time you have for this 'driver' section of code or the overall project.

hth
jay
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
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