Hi Marcin,

On 10/03/2010 12:19 AM, Marcin Cieslak wrote:
>>> Erich Waelde<[email protected]>  wrote:
>>
>> The bit $10, which is apparently not set, ist the MSTR bit. That fits
>> the symtoms I'm seeing: "spirw" (available in core/words/spirw.asm)
>> never returns, because SPIF in register SPSR is never set. No wonder,
>> if we are not in master mode to begin with. The bit-bang version
>> never looks at SPSR and SPCR.
>
> I've had this when some other device on the SPI bus was pulling /SS low
> and thus forced us to be slave.

Turn's out that /SS is driven low _internally_!!! Who would have thougt ...

So the fix is easy:

 > PORTB 4 portpin: /ss
  ok
 > /ss high \ turn on internal pullup
  ok
 > SPCR c@ .
0  ok
 > $53 SPCR c!
  ok
 > SPCR c@ .
53  ok
 >

THEN after initializing everything as before, talking to the maxim 186 works:


 > @ch3 decimal u.
1816  ok


Thanks!
Erich


--- complete programm for reference 
--------------------------------------------------------------
\ 2009-06-01  EW   33_spi/main2.fs
\ spi, hw interface
\ 2010-10-03  EW   finally fixed: internal pullup on /ss

\ "><spi" can now be exchanged to "spirw" found in core/words/spirw.asm

marker --start--

\ include devices/atmega32.frt    \ register definitions
$3A constant DDRA        \ Port A Data Direction Register
$39 constant PINA        \ Port A Input Pins
$3B constant PORTA       \ Port A Data Register
\ PORTB
$37 constant DDRB        \ Port B Data Direction Register
$36 constant PINB        \ Port B Input Pins
$38 constant PORTB       \ Port B Data Register
\ PORTC
$34 constant DDRC        \ Port C Data Direction Register
$33 constant PINC        \ Port C Input Pins
$35 constant PORTC       \ Port C Data Register
\ PORTD
$31 constant DDRD        \ Port D Data Direction Register
$30 constant PIND        \ Port D Input Pins
$32 constant PORTD       \ Port D Data Register
\ SPI
$2D constant SPCR        \ SPI Control Register
$2F constant SPDR        \ SPI Data Register
$2E constant SPSR        \ SPI Status Register

include lib/bitnames.frt        \ port_pin: high low pin_{out,in}put
\ ----------------------------------------------------------
\ pin layout, bus addresses, IDs ...

\ --- pins:
PORTA 0 portpin: led0           \ .

\ ----------------------------------------------------------
\ include files ... or words stolen from there :-)
: ms    ( n -- )  0 do 1ms loop ;


\ ----------------------------------------------------------
\ include ewlib/spi.fs

PORTB 4 portpin: /ss   \ not used as select here!
PORTB 5 portpin: _mosi
PORTB 6 portpin: _miso
PORTB 7 portpin: _clk

: spi.init ( -- )
   /ss high \ activate pullup, otherwise master mode will not work!
   _mosi high _mosi pin_output
\  _miso high _miso pin_input  \ ??? muß das highZ sein???
   _clk  low  _clk  pin_output
   $53 SPCR c!
;

\ transfer 1 byte
: ><spi ( x -- x' )
   SPDR c!
   begin SPSR c@ $80 and until
   SPDR c@
;
\ transfer 1 cell
: 2><spi
   dup 8 rshift ><spi
   swap ><spi
   swap 8 lshift +
;

\ transfer N bytes
\ uses stack as temp.array! Highly deprecated!
\ using "roll" would be cleaner
: @spn  ( x0 .. xN-1 i -- x0 .. xN-1 xi )
   1+ cells sp@ + @ ;
: !spn  ( x0 .. xi .. xN-1 yi i -- x0 .. yi .. xN-1 )
   2 + cells sp@ + ! ;
: N><spi ( x0 .. xN-1 N -- y0 .. yN-1 )
   1- 0 swap do
     i @spn
     ><spi
     i !spn
   -1 +loop ;

\ ----------------------------------------------------------
\ include spi-maxim-186.fs
\ control byte:
\ channel 0, unipolar, single ended, external clock -> $8f

PORTC 2 portpin: _sel
: adc.init
   -jtag
   _sel  high _sel  pin_output
;

\ 1 clock cycle is lost; we should wait for SSTRB to become high
\ instead. However, we are slow enough. So "3 rshift" not "4 rshift"
: @adc.ch3 ( -- value )
   _sel low
   $df ><spi drop
   $00 ><spi $00 ><spi
   _sel high
   swap 8 lshift + 3 rshift
;
: @ch3 ( -- value )
   _sel low
   $df $00 $00 3 N><spi
   _sel high
   swap 8 lshift + 3 rshift
   swap drop
;

\ ----------------------------------------------------------
\ main
decimal

: io.init
   led0 high  led0 pin_output
;

: loop.init
   io.init
   spi.init
   adc.init
;

: run
   decimal
   loop.init
   begin
     led0 low
     @ch3 cr .
     500 ms
     led0 high
     500 ms
   key? until

;


------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Amforth-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/amforth-devel

Reply via email to