Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
04/14/05 20:55
Modified:
  04/14/05 21:03

Read: times


 
#91581 - MAX7301 problem
Sanity check needed.

I am currently using the MAX 7301 SPI I/O expander in a new project
http://pdfserv.maxim-ic.com/en/ds/MAX7301.pdf

Nice, standard SPI interface. My problem is with bit order ! I have convinced myself both ways round from the datasheet.

The datasheet says.....to WRITE to a port....

1) Take SCLK low.
2) Take CS low. This enables the internal 16-bit shift
register.
3) Clock 16 bits of data into DIN—D15 first, D0 last—
observing the setup and hold times (bit D15 is low,
indicating a write command).
4) Take CS high (either while SCLK is still high after
clocking in the last data bit, or after taking SCLK
low).
5) Take SCLK low (if not already low).


...and to READ from it....


Any register data within the MAX7301 may be read by
sending a logic high to bit D15. The sequence is:
1) Take SCLK low.
2) Take CS low (this enables the internal 16-bit Shift
register).
3) Clock 16 bits of data into DIN—D15 first to D0 last.
D15 is high, indicating a read command and bits
D14 through D8 containing the address of the register
to be read. Bits D7–D0 contain dummy data,
which is discarded.
4) Take CS high (either while SCLK is still high after
clocking in the last data bit, or after taking SCLK
low), positions D7 through D0 in the Shift register
are now loaded with the register data addressed by
bits D1 through D8.
5) Take SCLK low (if not already low).
6) Issue another read or write command (which can
be a No-Op), and examine the bit stream at DOUT;
the second 8 bits are the contents of the register
addressed by bits D1 through D8 in step 3.

Now, I am asking to read from register $40 - I can do that, and I SHOULD as far as I can see see port data from port bits 4,5,6,7 appear in D0,D1,D2,D3, with D4..D7 being 0....

NOWHERE do I get the impression that the bit order is reversed from natural order from the datasheet, except that, by examination of the bit stream it bloody well is.

AFAIK, the bit stream coming OUT of Dout is eventually (15.5 clocks late) a shifted copy of the INPUT stream, except in the reading of registers phase, the data to be transmitted is put into D7..D0.....

The code snippet in question is here.
regname is the address of the register to be read/written to.
regdataoutput is data to be transmitted to the 7301 ports
regdatainput is the address of the location for data to be received from 7301.
&MAX7301INPUT:
&Max7301OUTPUT:

	PUSH 	IE			;Save current interrupt state.
        CLR	EA
	MOV	A,max7301output|regname
	
	JB	acc.7,Readdata  ; D7 :If HIGH its a READ if LOW its a write.

 	CALL 	writedata        
        SETB	7301_cs

	POP	IE		;Don't forget interrupt on stack
	RET
	REGEND

READDATA:
	CALL 	writedata		;Write out address of register to be read, with D15 set, write 8 other bits of crap.
	SETB	7301_CS	;Then writeout dummys and read BACK from Dout
        ;Get data from chip, do 8 dummy reads and clock out the state of Dout to a register.
	CLR	7301_CS

	MOV	r0,#8
	CLR	A
	CLR 	7301_Dat		;Effectively write NOP TO selected register while still being READ
	CLR	C
loop2:	SETB	7301_Sclk
	CLR 	7301_Sclk	
	DJNZ	r0,loop2 ;This is the dummy write of first 8 bits
	
	MOV	r0,#8                   
loop3:	SETB	7301_Sclk
	MOV	C,7301_Dout
	
        CLR	7301_Sclk	
	RLC	A
	DJNZ	r0,loop3
        MOV	r0,max7301Input|regdatainput ; Get address of    register to return value of
	MOV	@r0,A           ;Result in Acc., send to indirect  
	SETB	7301_cs
	POP 	IE		;Don't forget that interrupt
	RET
	REGEND

;write out data
writedata:
	CLR 	7301_sclk
        CLR 	7301_CS
        CALL    clockdata ;Acc contains address of internal                    register to set
        MOV	A,max7301output|regdataoutput  ; Now acc contains data to set.
        CALL 	clockdata
        SETB	7301_CS
        RET

clockdata:
	MOV 	r0,#8
loop1:  RLC 	A
	MOV 	7301_dat,C
        SETB	7301_sclk
        clr     7301_sclk
        DJNZ 	r0,loop1
        RET  



The weird thing is, everything works, I can read and write, but the bit order in the readback seems reversed. What have I missed. D15..D0 come trotting out of Dout, I capture the last 8 bits, and as they arrive clock them LEFT into the accumulator, so that d7 is in the left most place and D0 is in the right most place....

But this ISN'T how it looks. If I change the RLC in loop3 to RRC the bit order is correct, as per the datasheet, but not as per my view of the bitstream.

WHERES THE ERROR !

Steve




No replies in thread

Back to Subject List