2 * \brief Size-optimized code for TPI
4 * \author S³awomir Fra
\9c
10 #define TPI_CLK_PORT PORTB
11 #define TPI_CLK_DDR DDRB
13 #define TPI_DATAOUT_PORT PORTB
14 #define TPI_DATAOUT_DDR DDRB
15 #define TPI_DATAOUT_BIT 3
17 # define TPI_DATAIN_PIN PINB
18 # define TPI_DATAIN_DDR DDRB
19 # define TPI_DATAIN_BIT 4
21 # define TPI_DATAIN_PIN PINB
22 # define TPI_DATAIN_BIT 3
34 sbi _SFR_IO_ADDR(TPI_CLK_DDR), TPI_CLK_BIT
36 /* DATAIN <= pull-up */
37 cbi _SFR_IO_ADDR(TPI_DATAIN_DDR), TPI_DATAIN_BIT
38 sbi _SFR_IO_ADDR(TPI_DATAIN_PORT), TPI_DATAIN_BIT
40 sbi _SFR_IO_ADDR(TPI_DATAOUT_DDR), TPI_DATAOUT_BIT
41 sbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT
44 cbi _SFR_IO_ADDR(TPI_DATAOUT_DDR), TPI_DATAOUT_BIT
45 sbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT
61 * lost: r18-r21,r24,r30-r31
65 ldi r24, TPI_OP_SSTPR(0)
69 ldi r24, TPI_OP_SSTPR(1)
78 * lost: r18-r19,r30-r31
106 * Exchange of one bit
116 // DATAOUT = high (opto should allow TPIDATA to be pulled low by external device)
119 sbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT
122 cbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT
128 cbi _SFR_IO_ADDR(TPI_DATAOUT_DDR), TPI_DATAOUT_BIT
129 sbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT
132 cbi _SFR_IO_ADDR(TPI_DATAOUT_PORT), TPI_DATAOUT_BIT
133 sbi _SFR_IO_ADDR(TPI_DATAOUT_DDR), TPI_DATAOUT_BIT
138 lds r31, tpi_dly_cnt+1
143 sbi _SFR_IO_ADDR(TPI_CLK_PORT), TPI_CLK_BIT
145 in r30, _SFR_IO_ADDR(TPI_DATAIN_PIN)
146 bst r30, TPI_DATAIN_BIT
149 lds r31, tpi_dly_cnt+1
155 cbi _SFR_IO_ADDR(TPI_CLK_PORT), TPI_CLK_BIT
162 * lost: r18-r19,r30-r31
164 .global tpi_recv_byte
166 /* waitfor(start_bit, 192); */
170 brtc .tpi_recv_found_start
173 /* no start bit: set return value */
176 /* send 2 breaks (24++ bits) */
186 .tpi_recv_found_start:
187 /* recv 8bits(+calc.parity) */
210 .global tpi_read_block
220 ldi r24, TPI_OP_SLD_INC
232 .global tpi_write_block
242 ldi r24, TPI_OP_SOUT(NVMCMD)
244 ldi r24, NVMCMD_WORD_WRITE
246 ldi r24, TPI_OP_SST_INC
251 ldi r24, TPI_OP_SIN(NVMCSR)
255 brne .tpi_nvmbsy_wait