Не могу разобраться с dataflash AT26DF161. Может ктонить работал с такой...или любой из серии AT26...
Пытаюсь записать несколько байт в Sequential Program Mode.
Затем пытаюсь считать.
Вот код:
Код
AT26WriteBlock:
clr tmp0
sts PORTG,tmp0; CS=0
call CS_wait
ldi tmp0,0xAD ; sequential program mode
call SPIWriteByte
lds tmp0,AT26_addr+2
call SPIWriteByte
lds tmp0,AT26_addr+1
call SPIWriteByte
lds tmp0,AT26_addr
call SPIWriteByte
ldi R30,LOW(flash_buf)
ldi R31,HIGH(flash_buf)
ld tmp0,Z+
call SPIWriteByte
ldi tmp0,1
sts PORTG,tmp0; CS=1
call CS_wait
call AT26Wait
ldi tmp3,15
wr_spi_loop:
clr tmp0
sts PORTG,tmp0; CS=0
call CS_wait
ldi tmp0,0xAD ; sequential program mode
call SPIWriteByte
ld tmp0,Z+
call SPIWriteByte
ldi tmp0,1
sts PORTG,tmp0; CS=1
call CS_wait
call AT26Wait
dec tmp3
tst tmp3
brne wr_spi_loop
call AT26WriteDisable
ret
AT26ReadBlock:
clr tmp0
sts PORTG,tmp0; CS=0
call CS_wait
ldi tmp0,0x0B
call SPIWriteByte
lds tmp0,AT26_addr+2
call SPIWriteByte
lds tmp0,AT26_addr+1
call SPIWriteByte
lds tmp0,AT26_addr
call SPIWriteByte
call SPIWriteByte; dummy
ldi R30,LOW(flash_buf)
ldi R31,HIGH(flash_buf)
ldi tmp3,16
rd_spi_loop:
call SPIReadByte
st Z+,tmp0
dec tmp3
tst tmp3
brne rd_spi_loop
ldi tmp0,1
sts PORTG,tmp0; CS=1
call CS_wait
ret
clr tmp0
sts PORTG,tmp0; CS=0
call CS_wait
ldi tmp0,0xAD ; sequential program mode
call SPIWriteByte
lds tmp0,AT26_addr+2
call SPIWriteByte
lds tmp0,AT26_addr+1
call SPIWriteByte
lds tmp0,AT26_addr
call SPIWriteByte
ldi R30,LOW(flash_buf)
ldi R31,HIGH(flash_buf)
ld tmp0,Z+
call SPIWriteByte
ldi tmp0,1
sts PORTG,tmp0; CS=1
call CS_wait
call AT26Wait
ldi tmp3,15
wr_spi_loop:
clr tmp0
sts PORTG,tmp0; CS=0
call CS_wait
ldi tmp0,0xAD ; sequential program mode
call SPIWriteByte
ld tmp0,Z+
call SPIWriteByte
ldi tmp0,1
sts PORTG,tmp0; CS=1
call CS_wait
call AT26Wait
dec tmp3
tst tmp3
brne wr_spi_loop
call AT26WriteDisable
ret
AT26ReadBlock:
clr tmp0
sts PORTG,tmp0; CS=0
call CS_wait
ldi tmp0,0x0B
call SPIWriteByte
lds tmp0,AT26_addr+2
call SPIWriteByte
lds tmp0,AT26_addr+1
call SPIWriteByte
lds tmp0,AT26_addr
call SPIWriteByte
call SPIWriteByte; dummy
ldi R30,LOW(flash_buf)
ldi R31,HIGH(flash_buf)
ldi tmp3,16
rd_spi_loop:
call SPIReadByte
st Z+,tmp0
dec tmp3
tst tmp3
brne rd_spi_loop
ldi tmp0,1
sts PORTG,tmp0; CS=1
call CS_wait
ret
Перед записью делаю глобальный унлок вот так:
Код
call SPIMasterInit
call AT26WriteEnable; разрешаю запись
clr tmp1
call AT26WriteStatus; сбрасываю бит SPRL регистра статуса
call AT26WriteEnable; разрешаю запись
call AT26WriteBlock ; пишу в память
call AT26ReadBlock ; тут считываются одни 0xFF
call AT26WriteEnable; разрешаю запись
clr tmp1
call AT26WriteStatus; сбрасываю бит SPRL регистра статуса
call AT26WriteEnable; разрешаю запись
call AT26WriteBlock ; пишу в память
call AT26ReadBlock ; тут считываются одни 0xFF
SPI настроен правильно и микросхема подключена и согласована по уровням.
Device ID считывается правильно. Может гдето косяк в алгоритме разблокировки защиты записи?