hey Ioannis,
here is my code that I have working. I am using my own RFEFX board which includes an RF. If you have any questions please don't hesitate to ask. after i cleaned up some of Jim's code, as I have a different platform, the lights kinda just went off in my head and it all became real easy. For Video Click Here (9MB File takes a min to load)
Code:
'****************************************************************
'* Name : ISD17XX.BAS
'* Authors : Jerson,Brenon,Jim,Gary
'****************************************************************
define OSC 20
Time1 var word 'these variables used for the Erase flash
Time2 var byte 'LEDS when the device is erased
'used in Label - FlashLED:
time1 = 5000
time2 = 50
'******************** DEFINE VARIABLES ***********************
temp_bit VAR BIT
temp VAR BYTE
spi_cnt var byte ' counter for SPI transfer
bSPI var byte ' the byte being transferred on SPI
s_addr VAR WORD ' Start Address
e_addr VAR WORD ' End Address
ISD_Data var byte[7] ' This array contains data to/from ISD
SR0a var ISD_Data[0]
SR0b var ISD_Data[1]
SR1 var ISD_Data[2] ' only valid after ReadStatus
isCmdErr var SR0a.0 ' 1=previous command failed/ignored
isFull var SR0a.1 ' 1=memory full
isPU var SR0a.2 ' 1=ISD powered up
isEOM VAR SR0a.3 ' 1=EOM detected (clear by CLR_INT command)
isINT var SR0a.4 ' 1=current operation completed (clear by CLR_INT command)
isReady var SR1.0 ' 1=Ready to receive SPI command (only valid after ReadStatus)
' Some SPI commands can still be sent when isReady=0
'******************** PIN ASSIGNMENTS ************************
Symbol miso = PORTC.5 'ISD1760 SPI MISO
Symbol LED1 = PORTA.5 '
Symbol LED2 = PORTA.0 '
Symbol ss = PORTC.7 'ISD1760 SLAVE SELECT
Symbol sclk = PORTC.4 'ISD1760 SPI CLOCK
Symbol mosi = PORTC.6 'ISD1760 SPI MOSI
'******************** INITIALIZATION *************************
initialize:
' Im using a PIC 16F876A with an external 20 MHZ clock
' there is really little setup.
HIGH ss 'start with Slave Select HIGH
HIGH sclk 'start with SPI Clock HIGH
LOW MOSI 'start with MOSI LOW
LOW LED1
LOW led2
start: 'Initialize the ISD
GoSub isd_pu
PAUSE 50 '50 mS Power Up Delay (per datasheet)
'I removed the APC because it doesn't work on my Audio Board
PAUSE 10
GoSub isd_clr_int 'clear interrupt and EOM
gosub erase 'this will erase the ISD chip whenever
'I reprogram my PIC
'********************* MAIN PROGRAM **************************
main_loop: '(MAIN PROGRAM LOOP)
PAUSE 2000
RecordLoop: 'Here is my board waiting for me to
if portc.3 = 1 then Record 'push the record button
goto recordLoop
Record:
high led1 'a record LED
if portc.3 = 1 then record 'it will not continue until i
'release the button
s_addr = $010 'a 1 second clip takes approx 16 rows of
e_addr = $01f 'memory space $010-$01F = 16
GOSUB isd_set_rec 'this Set_rec identical to set_play
'was added so i could record a message
PAUSE 2000
GOSUB isd_stop ' an immediate stop to stop recording
low led1 ' turn record LED off
Playloop: 'the same button then becomes a play button
'pause 2000
if portc.3 = 1 then play
goto playloop
Play:
high led2 'a different LED for play
if portc.3 = 1 then play 'wont play until button is released
s_addr = $010 'playing back from the same 16 rows
e_addr = $01f
GOSUB isd_set_play
PAUSE 2000
GOSUB isd_stop
low led2
Eraseloop:
'pause 2000
if portc.3 = 1 then play 'in this loop you can either play the sound
if portc.5 = 1 then erase 'again or erase it and record another one
goto Eraseloop 'two different buttons are used
Erase: 'this is the erase subroutine which is also
if portc.5 = 1 then erase 'called at the beginning of this program
s_addr = $010 'this is not a Gang erase so the Start and
e_addr = $01f 'End address must be present or you will get
GOSUB isd_set_erase 'a command error
gosub flashLED 'when i erase the chip a series of LEDS
'are flased to indicate an erase.
pause 1000
goto recordloop 'after an erase it goes back to record loop
'********************** SUBROUTINES **************************
isd_pu:
LOW ss
bSPI=$01 'Power Up Command
GoSub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI=$00
GoSub isd_spi
ISD_Data[1] = bSPI 'SR0b
HIGH ss
RETURN
'--------------------------------------------------------------------------
isd_wait_ready:
GOSUB isd_rd_status
IF isReady = 0 THEN isd_wait_ready
RETURN
'--------------------------------------------------------------------------
isd_set_play:
LOW ss
bSPI = $80 'Set Play Command (7 bytes)
GoSub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI = $00
GoSub isd_spi
ISD_Data[1] = bSPI 'SR0b
bSPI = s_addr.LowByte ' Start Address low byte.
GoSub isd_spi
ISD_Data[2] = bSPI 'SR0a
bSPI = s_addr.HighByte ' Start Address high byte
GoSub isd_spi
ISD_Data[3] = bSPI 'SR0b
bSPI = e_addr.LowByte ' End Address low byte
GoSub isd_spi
ISD_Data[4] = bSPI 'SR0a
bSPI = e_addr.HighByte ' End Address high byte
GoSub isd_spi
ISD_Data[5] = bSPI 'SR0b
bSPI = $00 ' Reserved Address - set to "0"
GoSub isd_spi
ISD_Data[6] = bSPI 'SR0a
HIGH ss
RETURN
'--------------------------------------------------------------------------
isd_Set_Erase:
LOW ss
bSPI = $82 'Set Erase Command (7 bytes)
GoSub isd_spi
ISD_Data[0] = bSPI SR0a
bSPI = $00
GoSub isd_spi
ISD_Data[1] = bSPI 'SR0b
bSPI = s_addr.LowByte 'Start Address low byte.
GoSub isd_spi
ISD_Data[2] = bSPI 'SR0a
bSPI = s_addr.HighByte 'Start Address high byte
GoSub isd_spi
ISD_Data[3] = bSPI 'SR0b
bSPI = e_addr.LowByte 'End Address low byte
GoSub isd_spi
ISD_Data[4] = bSPI 'SR0a
bSPI = e_addr.HighByte 'End Address high byte
GoSub isd_spi
ISD_Data[5] = bSPI 'SR0b
bSPI = $00 'Reserved Address - set to "0"
GoSub isd_spi
ISD_Data[6] = bSPI 'SR0a
HIGH ss
RETURN
'--------------------------------------------------------------------------
isd_set_rec:
LOW ss
bSPI = $81 'Set Record Command (7 bytes)
GoSub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI = $00
GoSub isd_spi
ISD_Data[1] = bSPI 'SR0b
bSPI = s_addr.LowByte 'Start Address low byte.
GoSub isd_spi
ISD_Data[2] = bSPI 'SR0a
bSPI = s_addr.HighByte 'Start Address high byte
GoSub isd_spi
ISD_Data[3] = bSPI 'SR0b
bSPI = e_addr.LowByte 'End Address low byte
GoSub isd_spi
ISD_Data[4] = bSPI 'SR0a
bSPI = e_addr.HighByte 'End Address high byte
GoSub isd_spi
ISD_Data[5] = bSPI 'SR0b
bSPI = $00 'Reserved Address - set to "0"
GoSub isd_spi
ISD_Data[6] = bSPI 'SR0a
HIGH ss
RETURN
'--------------------------------------------------------------------------
isd_spi: ' shift SPI data out and into SPI byte
FOR spi_cnt = 0 to 7 '
MOSI = bSPI.0 ' shift LSB of byte onto MOSI line
LOW SCLK ' clock MISO data out to uC (Falling Edge)
temp_bit = miso '
HIGH SCLK ' clock MOSI into ISD1700 (Rising Edge)
bSPI = bSPI >> 1 ' shift SPI byte Right
bSPI.7 = temp_bit
NEXT spi_cnt
RETURN
'--------------------------------------------------------------------------
isd_clr_int: ' CLEAR INTERRUPT AND EOM BITS
LOW SS
bSPI=$04 'Clear Interrupt Command
gosub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI=$00
gosub isd_spi
ISD_Data[1] = bSPI 'SR0b
HIGH SS
RETURN
'--------------------------------------------------------------------------
isd_stop: ' Stop Immediately
LOW ss
bSPI=$02 'Stop Command
gosub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI=$00
gosub isd_spi
ISD_Data[1] = bSPI 'SR0b
HIGH ss
RETURN
'--------------------------------------------------------------------------
isd_rd_status: 'read status of ISD1700
LOW ss '
bSPI=$05 'Read Status Command
gosub isd_spi
ISD_Data[0] = bSPI 'SR0a
bSPI=$00
gosub isd_spi
ISD_Data[1] = bSPI 'SR0b
bSPI=$00
gosub isd_spi
ISD_Data[2] = bSPI 'SR1
HIGH ss
RETURN
'*********** Erase Indicators ********************************
FlashLED:
pulsout porta.5,time1
pause time2
pulsout porta.3,time1
pause time2
pulsout porta.2,time1
pause time2
pulsout porta.1,time1
pause time2
pulsout porta.0,time1
pause time2
low porta.0
return
End
Bookmarks