I implemented hardware SPI using a PIC 16F877A and an ISD1740. I do it with ASM, but you can translate it to PICBasic if needed.
I'm posting it here because is the most extensive thread in the subject I could found, and I haven't found information about how to do it by hardware anywhere. I haven't finish yet, but I will probably forget to post it here late, so here goes what I've done so far.
As PIC SPI is Msb -> Lsb and ISD1700 is Lsb -> Msb, everything is inverted.
Sorry for the code format, I couldn't find a way to post it properly formatted.Code:ISD commands: ;ISD led active on all the commands, for debugging, set bit 3 to 0 to disable ISD led flashing CONSTANT SND_CMD_PU = b'10001000' CONSTANT SND_CMD_SET_PLAY = b'00001001' CONSTANT SND_CMD_SET_REC = b'10001001' CONSTANT SND_CMD_PD = b'11101000' CONSTANT SND_CMD_CLR_INT = b'00101000' CONSTANT SND_CMD_WR_APC2 = b'10101110' CONSTANT SND_CMD_WR_NVCFG = b'01101010' CONSTANT SND_CMD_RD_STATUS = b'10101000' ;PIC ISD ports and pins CONSTANT SND_PUERTO_ES = PORTC CONSTANT SND_CONTROL_ES = TRISC CONSTANT SND_PIN_E = .4 CONSTANT SND_PIN_S = .5 CONSTANT SND_PUERTO_CLK = PORTC CONSTANT SND_CONTROL_CLK = TRISC CONSTANT SND_PIN_CLK = .3 CONSTANT SND_PUERTO_SS = PORTA CONSTANT SND_CONTROL_SS = TRISA CONSTANT SND_PIN_SS = .5 ;SPI configuration and activation ;PORTS config banksel SND_CONTROL_ES BCF SND_CONTROL_ES,SND_PIN_S BSF SND_CONTROL_ES,SND_PIN_E banksel SND_CONTROL_CLK BCF SND_CONTROL_CLK,SND_PIN_CLK banksel SND_PUERTO_ES BCF SND_PUERTO_ES,SND_PIN_S banksel SND_PUERTO_CLK BSF SND_PUERTO_CLK,SND_PIN_CLK ;SPI config banksel PIE1 BSF PIE1,SSPIE ;enable interrupt banksel SSPSTAT MOVLW b'00000000' MOVWF SSPSTAT ;SSPM3:0 = 0001 = Fosc/16 banksel SSPCON MOVLW b'00110001' MOVWF SSPCON ;use SS to signal command start/stop banksel SND_CONTROL_SS BCF SND_CONTROL_SS,SND_PIN_SS banksel SND_PUERTO_SS BSF SND_PUERTO_SS,SND_PIN_SS ;SPI usage if not using interrupts ;active waiting for SPI transmission to end snd_debug_esperar banksel SSPSTAT BTFSS SSPSTAT,BF GOTO snd_debug_esperar BCF SSPSTAT,BF RETURN ;SPI without interrupts, to verify it works snd_debug ;it has to be already configured, I'm ignoring ISD response banksel SND_PUERTO_SS BCF SND_PUERTO_SS,SND_PIN_SS ;start command banksel SSPBUF MOVLW SND_CMD_PU ;first byte MOVWF SSPBUF CALL snd_debug_esperar banksel SSPBUF MOVFW SSPBUF CLRW MOVWF SSPBUF call snd_debug_esperar banksel SND_PUERTO_SS BSF SND_PUERTO_SS,SND_PIN_SS ;enviar un SET_PLAY pagesel snd_debug banksel SND_PUERTO_SS BCF SND_PUERTO_SS,SND_PIN_SS MOVLW SND_CMD_SET_PLAY banksel SSPBUF MOVWF SSPBUF CALL snd_debug_esperar banksel SSPBUF MOVFW SSPBUF CLRW MOVWF SSPBUF call snd_debug_esperar banksel SSPBUF MOVFW SSPBUF MOVLW b'0000100' ; 0x10 inverted MOVWF SSPBUF call snd_debug_esperar banksel SSPBUF MOVFW SSPBUF MOVLW 0x00 MOVWF SSPBUF call snd_debug_esperar banksel SSPBUF MOVFW SSPBUF MOVLW b'0111111' ; 0x7E inverted MOVWF SSPBUF call snd_debug_esperar banksel SSPBUF MOVFW SSPBUF MOVLW 0x00 MOVWF SSPBUF call snd_debug_esperar banksel SSPBUF MOVFW SSPBUF CLRW MOVWF SSPBUF call snd_debug_esperar banksel SND_PUERTO_SS BSF SND_PUERTO_SS,SND_PIN_SS return
DAvid




Bookmarks