Obtenga más información de chip flash adjunto de AS de ALTASMI

0

Estoy jugando con la conexión de varios dispositivos flash de configuración al Altera Cyclone 3. En particular, quiero reemplazar el EPCS16 (2MB) por W25Q128 (16MB), tanto por su tamaño como por su costo.

Parece que a Altera / Intel no le gusta que la gente haga esto; y hay poca información sobre el conjunto de comandos aceptado por los dispositivos EPCS. Sospecho que hay más comandos que los que figuran en datasheet . También leí en algún otro lugar que los dispositivos EPCS son solo dispositivos con una nueva marca que Altera no fabrica (ya que no hacen dispositivos flash desde hace bastante tiempo).

De todos modos, la hoja de datos sería muy útil cuando desee desarrollar su propia interfaz de configuración flash IP; en este momento estoy usando ALTASMI_PARALLEL , que Parece que funcionan correctamente con el chip W25Q.

Sin embargo, esta megafunción solo permite leer el ID de silicio (comando 0xAB, read_sid ) y la identificación del dispositivo (comando 0x9F, la parte de "ID de capacidad", read_rdid ). Ambas solicitudes funcionan para mí usando ALTASMI, con SID que devuelve 0x14 (EPCS16) y RDID que devuelve 0x15 (2 ^ 21 = 2MB).

Comparando EPCS y W25Q , veo que ambos chips informan 3 bytes para el comando 0x9F (el comando se llama JEDEC ID) , pero la hoja de datos EPCS dice que los dos primeros bytes son "ficticios". Se espera que estos bytes contengan el ID del fabricante y los 8 bits superiores del ID del dispositivo.

Sospecho que el dispositivo EPCS devuelve algo dentro de estos bytes; pero Altera no se molestó en implementarlos obteniendo de la megafunción ASMI como esperan (o quieren / forzar) a los desarrolladores que usan sus dispositivos EPCS de marca.

Al mirar los archivos creados por megafunction veo la instancia de asmi_altasmi_parallel_pio2_component , solo 8 bits de los cuales se usan como RDID, y no puedo encontrar más información (por ejemplo, , ¿puede este submódulo devolver un vector de 24 bits, no solo 8 utilizados por el módulo ALTASMI? ) este módulo en el mismo archivo "asmi" creado por el megafunction :).

¿Alguien había estado tratando con tal problema? Leer la ID completa de JEDEC ayudaría a identificar definitivamente el chip flash adjunto.

Lo bueno es que, con la implementación actual, todavía tengo un ID de capacidad devuelto por el comando RDID, por lo que al menos puede saber el tamaño de la memoria flash (lo necesito porque su primer 512K debe estar protegido contra escritura). Cualquier otra información que identifique el chip exacto no es crítica y es una especie de "cosmético" solo para mostrarlo en la pantalla (al menos no veo cómo puedo usarlo / aplicarlo en el entorno actual).

P.S. Alteraforum migró a los foros de Intel. Hubo personas más o menos independientes que compartieron sus conocimientos, ahora recibo respuestas de protección empresarial como "no es compatible" o "eres un tonto cliente". ¡Es por eso que formulo una pregunta aquí con la esperanza de que todavía haya expertos independientes!

    
pregunta Anonymous

1 respuesta

0

Después de varias horas de búsqueda en la oscuridad del código ASMI e intentando varias formas de entender e inyectar en el código existente, tengo el siguiente código funcionando correctamente en el módulo asmi_altasmi_parallel_ *:

// Added circuit to shift all 24-bit data within stage 3 (transfer after opcode shift)
reg [23:0] r_mfr_and_id;                                // should contain all 3 bytes: manufacturer's code, ID[15:0]
reg [23:0] r_mfr_and_id_out;                            // output latched byte
always@(posedge clkin_wire or posedge reset)
    if(reset == 1'b1) r_mfr_and_id[23:0] <= {24{1'b0}};
        else if((stage3_wire & do_read_rdid) == 1'b1)           // stage 3 in progress (3 bytes after opcode sent)
        r_mfr_and_id[23:0] <=
            { r_mfr_and_id[22:0], data0out_wire };              // capture all 24 bits shifting left

always@(negedge clkin_wire or posedge reset)
    if(reset == 1'b1) r_mfr_and_id_out[23:0] <= {24{1'b0}};
    else if(rdid_load == 1'b1)
            r_mfr_and_id_out[23:0] <= r_mfr_and_id[23:0];

Parece que el estado stage2 está enviando el código de operación al dispositivo AS, stage3 se usa para enviar o recibir datos (3 bytes después del código de operación), y stage4 es para la E / S de datos.

Y decidí, en lugar de inyectar en el código existente, hacer registros adicionales y dos declaraciones siempre, duplicando parcialmente los elementos internos ya existentes. Menos mal que no dependo de ninguna lógica intrincada dentro del código existente, y que la modificación es solo una adición de código. Lo malo es que agrego algunos registros y lógica que ya existen en el proyecto, pero dejo que el compilador optimice, estoy más interesado en la confiabilidad que en la sobrecarga de la pequeña huella.

La tarea adicional es garantizar que r_mfr_and_id_out[23:0] alambres suban al módulo de alto nivel ASMI que luego se puede usar en el módulo de nivel superior.

Por cierto, Altera / Intel propuso utilizar Interfaz Genérica Serial Flash Intel FPGA IP , pero no es compatible con la familia Cyclone III.

    
respondido por el Anonymous

Lea otras preguntas en las etiquetas