Итак, на плате с CycloneII имеется NAND Flash (от микрона, хотя это не суть важно, т.к. интерфейс один у всех).
Для начала пробую работать с этой памятью с помощью Nios через PIO.
Первая же простейшая операция чтения ID явно происходит неверно. 5 байт вместо ID кода получаю 0xfe,0x00,0x00,0x00,0xbc.
Выкладываю код подпрограммы чтения ID и картинку, по которой я это делаю.
Код
void flash_r_id (unsigned char* res) {
unsigned int i;
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_F_DQ_BASE, 1); //данные на выход
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_ALE_BASE,0); //ALE = 0
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_CE1_N_BASE,0); //CE = 0
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_CLE_BASE,1); //CLE = 1
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_WE_N_BASE,0); //WE = 0
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_RE_N_BASE,1); //RE = 1
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_DQ_BASE,0x90); //
flash_delay();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_WE_N_BASE,1); //WE = 1
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_CLE_BASE,0); //CLE = 0
flash_delay();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_ALE_BASE,1); //ALE = 1
flash_delay();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_WE_N_BASE,0); //WE = 0
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_DQ_BASE,0x00); //
flash_delay();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_WE_N_BASE,1); //WE = 1
flash_delay();
flash_delay();
flash_delay();
flash_delay();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_ALE_BASE,0); //ALE = 0
flash_delay();
flash_delay();
flash_delay();
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_F_DQ_BASE, 0); //данные на вход
for (i = 0; i < 5; i++) {
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_RE_N_BASE,0); //RE = 0
flash_delay();
flash_delay();
*res = IORD_ALTERA_AVALON_PIO_DATA(PIO_F_DQ_BASE);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_RE_N_BASE,1); //RE = 1
}
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_CE1_N_BASE,1); //CE = 0
}
void flash_delay() {
unsigned char i;
for(i = 0; i < 100; i++){};
}
unsigned int i;
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_F_DQ_BASE, 1); //данные на выход
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_ALE_BASE,0); //ALE = 0
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_CE1_N_BASE,0); //CE = 0
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_CLE_BASE,1); //CLE = 1
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_WE_N_BASE,0); //WE = 0
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_RE_N_BASE,1); //RE = 1
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_DQ_BASE,0x90); //
flash_delay();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_WE_N_BASE,1); //WE = 1
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_CLE_BASE,0); //CLE = 0
flash_delay();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_ALE_BASE,1); //ALE = 1
flash_delay();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_WE_N_BASE,0); //WE = 0
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_DQ_BASE,0x00); //
flash_delay();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_WE_N_BASE,1); //WE = 1
flash_delay();
flash_delay();
flash_delay();
flash_delay();
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_ALE_BASE,0); //ALE = 0
flash_delay();
flash_delay();
flash_delay();
IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_F_DQ_BASE, 0); //данные на вход
for (i = 0; i < 5; i++) {
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_RE_N_BASE,0); //RE = 0
flash_delay();
flash_delay();
*res = IORD_ALTERA_AVALON_PIO_DATA(PIO_F_DQ_BASE);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_RE_N_BASE,1); //RE = 1
}
IOWR_ALTERA_AVALON_PIO_DATA(PIO_F_CE1_N_BASE,1); //CE = 0
}
void flash_delay() {
unsigned char i;
for(i = 0; i < 100; i++){};
}
Вот, поглядите, может что забыл или вовсе не то делаю?