View previous topic :: View next topic |
Author |
Message |
logical
Joined: 21 Dec 2009 Posts: 57 Location: SouthPort, UK
|
16bit SPI_Write Question |
Posted: Tue Feb 02, 2010 4:18 pm |
|
|
Hi All,
Just after a bit of quick advice, I am trying to use a 16BIT Spi Function, rather than sending out 2x8bit chunks, I was wondering if it was possible to create an Unsigned INT16 then use that for the SPI_Write Command.
Basically SPI_WRITE(Unsigned INT16 Variable).
Compiler 4.093
Thanks
Chris
p.s sorry if this has been discussed before, had a look round with the search but could not find anything relating to this. |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Feb 02, 2010 5:39 pm |
|
|
Post your PIC. We don't remember your PIC from previous posts.
Also post if you are trying to do hardware, or software SPI. |
|
![](templates/subSilver/images/spacer.gif) |
logical
Joined: 21 Dec 2009 Posts: 57 Location: SouthPort, UK
|
|
Posted: Tue Feb 02, 2010 6:21 pm |
|
|
PCM programmer wrote: | Post your PIC. We don't remember your PIC from previous posts.
Also post if you are trying to do hardware, or software SPI. |
Thanks PCM as always, shame you not local as owe you a fair few drinks.
Pic Wise, 24HJ128GP504 or 18f4550 both obviously using Hardware SPI, this is totally a different project to the others I was working on, another thanks for that, with your (point in the right direction) I managed to complete the SH1101A Driver which works perfectly.
This one is for a new toy, full colour Densitron OLED with the SEPS525 Driver, I actually have one written by someone else in CCS (open source) BUT it is not for SPI sadly.
Let me know if that is of interest to you for you to play with. |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Feb 02, 2010 6:44 pm |
|
|
The 24HJ has the capability to transmit 16-bit data. The SPI module
can be configured for 8 or 16-bit mode. It doesn't look like CCS
supports 16-bit mode. I don't have the PCD compiler, so I can't test this.
But you can easily create an spi_write16() routine that will write two
sequential bytes. Example:
Code: |
#include <18F4550.h>
#fuses XT,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
// SPI mode definitions for 16F and 18F PICs (not for PIC24).
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
void spi_write16(int16 data)
{
spi_write(make8(data, 1)); // Send MSB
spi_write(make8(data, 0)); // Send LSB
}
//======================================
void main(void)
{
spi_write16(0x1234);
while(1);
}
|
|
|
![](templates/subSilver/images/spacer.gif) |
logical
Joined: 21 Dec 2009 Posts: 57 Location: SouthPort, UK
|
|
Posted: Tue Feb 02, 2010 7:09 pm |
|
|
PCM programmer wrote: | The 24HJ has the capability to transmit 16-bit data. The SPI module
can be configured for 8 or 16-bit mode. It doesn't look like CCS
supports 16-bit mode. I don't have the PCD compiler, so I can't test this.
But you can easily create an spi_write16() routine that will write two
sequential bytes. Example:
Code: |
#include <18F4550.h>
#fuses XT,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
// SPI mode definitions for 16F and 18F PICs (not for PIC24).
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
void spi_write16(int16 data)
{
spi_write(make8(data, 1)); // Send MSB
spi_write(make8(data, 0)); // Send LSB
}
//======================================
void main(void)
{
spi_write16(0x1234);
while(1);
}
|
|
Thanks again, i will do exactly that, once the screen is up and running I will have a go with 16bit SPI to see if I can send in one, I will also then post the results here as it may be useful to others if they come accross the same thing.
Will verify it with a scope as the board is almost completed.
Regards
Chris |
|
![](templates/subSilver/images/spacer.gif) |
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Wed Feb 03, 2010 12:53 am |
|
|
In my opinion, the advantage of using 16-Bit SPI transfer is more or less meaningless, if you don't need to transmit
large amounts of data at maximum SPI speed. Don't know, if this is the case in your application. That's the reason,
why I wasn't motivated yet to try it.
Generally, when using spi_write() and spi_read() together, you should be aware, that a succeeding spi_read()
possibly fails, because spi_write() doesn't wait for the SPI transaction to finish. A simple workaround is to use
spi_read() only. |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Feb 03, 2010 1:26 am |
|
|
You mean that with regard to the PCD compiler. |
|
![](templates/subSilver/images/spacer.gif) |
logical
Joined: 21 Dec 2009 Posts: 57 Location: SouthPort, UK
|
|
Posted: Wed Feb 03, 2010 12:47 pm |
|
|
Now I think I am finally losing it, I am getting 7clocks (tested on oscilloscope) when sending an 8bit SPI Write, thanks to PCM I hunted through the software and found the 16bit SPI Mode (SPI_MODE_16B) which works apart from one fact, that is sending 14clocks out on a 16bit Write.
At a total loss on this one, basically one missing clock per 8 which eliminates the trigger on the Scope, brand new PIC, no shorted tracks, proper filter capacitors within a few mm of the Micro and powered from a PicKit2 at 3.3v (also tested), no PLL and just for getting started, using a decent 4MHZ Crystal Oscillator.
To top it off, absolutely no data on the SPI Data Out Port. |
|
![](templates/subSilver/images/spacer.gif) |
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Wed Feb 03, 2010 4:46 pm |
|
|
Quote: | You mean that with regard to the PCD compiler. |
Yes, of course. It's a special PCD issue.
Quote: | I am getting 7clocks (tested on oscilloscope) when sending an 8bit SPI Write
...
To top it off, absolutely no data on the SPI Data Out Port. |
Sounds very dubious. You may want to share an example program that reproduces this waveforms. |
|
![](templates/subSilver/images/spacer.gif) |
logical
Joined: 21 Dec 2009 Posts: 57 Location: SouthPort, UK
|
|
Posted: Wed Feb 03, 2010 4:53 pm |
|
|
FvM wrote: | Quote: | You mean that with regard to the PCD compiler. |
Yes, of course. It's a special PCD issue.
Quote: | I am getting 7clocks (tested on oscilloscope) when sending an 8bit SPI Write
...
To top it off, absolutely no data on the SPI Data Out Port. |
Sounds very dubious. You may want to share an example program that reproduces this waveforms. |
I have tried creating the most basic code just to try and get a regular 8 bits out of the SPI Port, as you will see by the lines commented out, have just about ripped my hair out over this
When I disable the Write_Spi and uncomment the output_high/_low lines + the setup_spi2, the pin B3 works absolutely fine, the scope has markers to measure the waveform pulse width and confirms that to be correct too, have spent quite a few days on this before posting here to avoid wasting anyones time.
Chris
Code: | void main()
{
//setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_16);
setup_spi2(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_16);
#pin_select SCK1OUT=PIN_B12
#pin_select SDO1=PIN_B13
#pin_select SDI1=PIN_B11
//The following port is for the OLED
#pin_select SCK2OUT=PIN_B2
#pin_select SDO2=PIN_B3
#pin_select SDI2=PIN_C0
///////////////////////////////////
setup_wdt(WDT_OFF);
setup_timer1(TMR_DISABLED);
// delay_ms(500);
// oled_init();
int8 temp;
while (true){
spi_write2(0xff);
//output_high(pin_b3);
//delay_ms(50);
//output_low(pin_b3);
//delay_ms(50);
delay_us(200);
}
} |
|
|
![](templates/subSilver/images/spacer.gif) |
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Wed Feb 03, 2010 5:24 pm |
|
|
I also forgot to ask about the actual PIC24. Is it 24HJ128GP504 mentioned above? It may be the case, that #pin_select is not fully working in V4.093.
Also, what is exactly your observation with the below code? 7 or 8 clock pulses? SDO2 (PIN_B3) sending SPI data or not?
Last edited by FvM on Wed Feb 03, 2010 5:28 pm; edited 1 time in total |
|
![](templates/subSilver/images/spacer.gif) |
logical
Joined: 21 Dec 2009 Posts: 57 Location: SouthPort, UK
|
|
Posted: Wed Feb 03, 2010 5:25 pm |
|
|
FvM wrote: | I also forgot to ask about the actual PIC24. Is it 24HJ128GP504 mentioned above?
Also, what is exactly your observation with the below code? 7 or 8 clock pulses? SDO2 (PIN_B3) sending SPI data or not? |
Sure is 24HJ128GP504
No Data at all and 7 clock pulses. |
|
![](templates/subSilver/images/spacer.gif) |
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Wed Feb 03, 2010 5:40 pm |
|
|
At first look, I don't see a problem. Also #pin_select for SDO2 seems to be coded corrcectly by PCD V4.093. |
|
![](templates/subSilver/images/spacer.gif) |
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Thu Feb 04, 2010 12:28 am |
|
|
As an additional remark, with your code, you most likely see SDO permanent at "1". You may want to
send a pattern != 0xFF for test. I didn't see an explanation for getting 7 clocks only. Also reported silicon
errata don't point in this direction. By sending an alternating bit pattern and using different SPI modes, you
should be able to see, which clock bit is missing.
I would also try different system clock speeds and SPI clock dividers. You should also check with spi_read(). |
|
![](templates/subSilver/images/spacer.gif) |
logical
Joined: 21 Dec 2009 Posts: 57 Location: SouthPort, UK
|
|
Posted: Thu Feb 04, 2010 7:32 am |
|
|
FvM wrote: | As an additional remark, with your code, you most likely see SDO permanent at "1". You may want to
send a pattern != 0xFF for test. I didn't see an explanation for getting 7 clocks only. Also reported silicon
errata don't point in this direction. By sending an alternating bit pattern and using different SPI modes, you
should be able to see, which clock bit is missing.
I would also try different system clock speeds and SPI clock dividers. You should also check with spi_read(). |
Great thanks, will have a try with that and post the results. |
|
![](templates/subSilver/images/spacer.gif) |
|