SPISLAVE/de
== (**COPIED FROM ENGLISH PAGE**) ==SPISLAVE.LIB (LBX) is a library that can be used to create a SPI slave chip when the chip does not have a hardware SPI interface.
Although most AVR chips have an ISP interface to program the chip, the 2313 for example does not have a SPI interface.
When you want to control various micro’s with the SPI protocol you can use the SPISLAVE library.
The SPI-softslave.bas sample from the samples directory shows how you can use the SPISLAVE library.
Also look at the spi-slave.bas sample that is intended to be used with hardware SPI.
The sendspi.bas sample from the samples directory shows how you can use the SPI hardware interface for the master controller chip.
'----------------------------------------------------------------------------------------- 'name : spi-softslave.bas 'copyright : (c) 1995-2005, MCS Electronics 'purpose : shows how to implement a SPI SLAVE with software 'micro : AT90S2313 'suited for demo : yes 'commercial addon needed : no '----------------------------------------------------------------------------------------- $regfile = "2313def.dat" ' specify the used micro $crystal = 4000000 ' used crystal frequency $baud = 19200 ' use baud rate $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 ' default use 40 for the frame space 'Some atmel chips like the 2313 do not have a SPI port. 'The BASCOM SPI routines are all master mode routines 'This example show how to create a slave using the 2313 'ISP slave code 'define the constants used by the SPI slave Const _softslavespi_port = Portd ' we used portD Const _softslavespi_pin = Pind 'we use the PIND register for reading Const _softslavespi_ddr = Ddrd ' data direction of port D Const _softslavespi_clock = 5 'pD.5 is used for the CLOCK Const _softslavespi_miso = 3 'pD.3 is MISO Const _softslavespi_mosi = 4 'pd.4 is MOSI Const _softslavespi_ss = 2 ' pd.2 is SS 'while you may choose all pins you must use the INT0 pin for the SS 'for the 2313 this is pin 2 'PD.3(7), MISO must be output 'PD.4(8), MOSI 'Pd.5(9) , Clock 'PD.2(6), SS /INT0 'define the spi slave lib $lib "spislave.lbx" 'sepcify wich routine to use $external _spisoftslave 'we use the int0 interrupt to detect that our slave is addressed On Int0 Isr_sspi Nosave 'we enable the int0 interrupt Enable Int0 'we configure the INT0 interrupt to trigger when a falling edge is detected Config Int0 = Falling 'finally we enabled interrupts Enable Interrupts ' Dim _ssspdr As Byte ' this is out SPI SLAVE SPDR register Dim _ssspif As Bit ' SPI interrupt revceive bit Dim Bsend As Byte , I As Byte , B As Byte ' some other demo variables _ssspdr = 0 ' we send a 0 the first time the master sends data Do If _ssspif = 1 Then Print "received: " ; _ssspdr Reset _ssspif _ssspdr = _ssspdr + 1 ' we send this the next time End If Loop
When the chip has a SPI interface, you can also use the following example:
'----------------------------------------------------------------------------------------- 'name : spi-slave.bas 'copyright : (c) 1995-2005, MCS Electronics 'purpose : shows how to create a SPI SLAVE 'micro : AT90S8515 'suited for demo : yes 'commercial addon needed : no '----------------------------------------------------------------------------------------- $regfile = "8515def.dat" ' specify the used micro $crystal = 3680000 ' used crystal frequency $baud = 19200 ' use baud rate $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 ' default use 40 for the frame space ' use together with sendspi.bas '------------------------------------------------------------------ ' Tested on the STK500. The STK200 will NOT work. ' Use the STK500 or another circuit Dim B As Byte , Rbit As Bit , Bsend As Byte 'First configure the MISO pin Config Pinb.6 = Output ' MISO 'Then configure the SPI hardware SPCR register Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = Low , Phase = 0 , Clockrate = 128 'Then init the SPI pins directly after the CONFIG SPI statement. Spiinit 'specify the SPI interrupt On Spi Spi_isr Nosave 'enable global interrupts Enable Interrupts 'show that we started Print "start" Spdr = 0 ' start with sending 0 the first time Do If Rbit = 1 Then Print "received : " ; B Reset Rbit Bsend = Bsend + 1 : Spdr = Bsend 'increase SPDR End If ' your code goes here Loop 'Interrupt routine 'since we used NOSAVE, we must save and restore the registers ourself 'when this ISR is called it will send the content from SPDR to the master 'the first time this is 0 Spi_isr: push r24 ; save used register in r24,sreg ; save sreg push r24 B = Spdr Set Rbit ' we received something pop r24 !out sreg,r24 ; restore sreg pop r24 ; and the used register Return
Languages | English • Deutsch |
---|