dspic SPI problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

dspic SPI problem

Inlägg av dangraf »

Hallå!
Jag har lite problem med SPI porten på min dspic30F6012A.

Det jag vill göra är att skriva till SPI porten och samtidigt ge en read/write signal och en chip-select signal för varje byte som skickas.

Problemet som uppstår är att jag inte vet hur jag ska ta reda på när min byte är färdigskickad.

Microchip har skrivit rutiner för att skriva till SPI porten, men dessa använder sig av en bit som säger till när bufferten är redo att ta emot nästa byte, vilket jag inte är så intresserad av.

Enligt microchips referens-datablad:
http://ww1.microchip.com/downloads/en/ ... 0067c.pdf på sidan 8 står det bla:
When the transfer is complete, the following events will occur:
• The interrupt flag bit, SPIxIF, is set. SPI interrupts can be enabled by setting the
interrupt enable bit SPIxIE. The SPIxIF flag is not cleared automatically by the hardware.

jag har testat att skriva funktioner för att titta på just interrupt flaggan, men koden verkar hänga sig där.

Kod: Markera allt


int main(void)
{
	
	timer2_init();
 	init_io();
	spi2_init(SPI_PRI_PRESC_16_1 | SPI_SEC_PRESC_2_1);
	
	
	while(1)
	{

		oDISP_RS = !oDISP_RS; // toggle pins
		spi2_write(0x81);	// write to spi
		timer2_delay_ms(2);	//wait 2ms
	}
	return 1;
}


void spi2_init(uint16 u16Baud)
{
	IEC1bits.SPI2IE = 0;	// turn off interrupt
	SPI2CON = 0x0060 | u16Baud;
	SPI2STAT = 0x8000;	// turn on SPI2 module

}

void spi2_write(uint8 u8Data)
{
	IFS1bits.SPI2IF=0;		// clear flag from previous write

	SPI2BUF = u8Data;		// write to spi buff
	while(IFS1bits.SPI2IF==0)
	{
		// wait for transfer to complete
	}
	
	return;
}

Denna koden fungerar inte, koden hänger sig i while-satsen i "spi2_write" funktionen så ingen data klockas ut.
Men om denna lilla while-sats kommenteras bort, så ser jag snygga pulståg på klock och data-pinnen. Däremot vet jag inte när datan är färdigskickad..

Jag har ifs inte testat att enabla interruptet (Eftersom jag inte vill använda det), men ska det ha någon betydelse egentligen? Den ska väl sättas iaf??

några förslag på vad som kan vara problemet?? (mer än att jag e lite trött för tillfället?? :-) )

// Daniel
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

SPIRBF är väl bättre att kolla på.

Edit: Komplementerar med några slides http://techtrain.microchip.com/websemin ... 033005.pdf
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Tackar! enligt det databladet verkar det som att SPI2IF bara blir satt när modulen tar emot data, inte när man skickar.

Hur menar du att jag ska använda SPIRBF? Den avänds väll vid receive och sägger om RX bufferten är full eller inte..
Menar du SPITBF kanske? Detta är ju den biten som säger när bufferten är redo att ta emot ny data, inte att datan är färdigskickad.. :-(
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Inlägg av Micke_s »

testa

Kod: Markera allt

//SPI send and receive function
unsigned char spi(unsigned char data){
    unsigned char dummy; 
  
    dummy = SPI1BUF; //dummy read

    SPI1BUF = data;
    while (!SPI1STATbits.SPIRBF); //wait until receive buffer is full
    
    return SPI1BUF; //read and return data
}
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

jag har testat. när den väntat klart så har inte ens 1 klockcykel gått om jag har en prescaler på t.ex 8. :-( Jag har testat att skriva flera bytes till registret direkt efter varandra och då kan jag utöka till ca 4 klockcykler.
Det är lite underligt, jag kan inte får interrupt runtinen att fungera när jag kör transmit. Tycker databladet är väldigt otydligt vad som gäller för SPI rutinen och interrupts..

Funderar på att göra ett timer-interrupt som tar hand om SPI rutinen. Då jag ställer in vilken periodtid det tar för att skicka en byte. Känns lite som en onödigt kompicerad lösning, men det kanske funkar bättre än nu..
Skriv svar