Paso 5: Código código código!
Escribí un esbozo que me permite comunicar con la ONU vía comunicación serial TTY el Serial monitor (o incluso un sistema Unix, como se ver bien). Este es un método útil para la depuración de hardware nuevo, como puedo emitir comandos interactivamente.
La función de "serialEvent()" es una devolución de llamada incorporado, siempre que pasa algo en el objeto Serial por defecto. Usar esta devolución de llamada para construir una cadena de comando y un indicador booleano (la construcción de byte por byte de la cadena completa cuando la devolución de llamada lee como punto y coma ";" de la corriente; Usar esto en vez de un salto de línea ya que no es posible emitir una nueva línea del serial monitor). Cuando la devolución de llamada construye la cadena y establece la bandera, la función de "loop()" ejecuta un decodificador. El decodificador determina que función a llamar basado en la cadena de mando, analiza los parámetros adicionales de la cadena de comando y llama a esa función.
Cada función es esencialmente una envoltura alrededor de una implementación de bajo nivel de un diagrama de sincronización funcional WinBond SPI. He utilizado un contenedor para que las funciones de bajo nivel siguen siendo genéricas: yo puedo usar otra vez en otros bocetos con un cortar y pegar simple. Además, la envoltura imprime información para el usuario, que es muy útil para depurar.
La imagen de arriba muestra una sesión interactiva con el Monitor serie. Yo he publicado cuatro comandos, "get_jedec_id;", "read_page 0;", "write_byte 0 2 8;" y "read_page 0;" Realmente no puede ver los comandos (el monitor serial no tiene eco, y no imprime el comando exacto... Probablemente debo tengo), pero ver la respuesta. Debe ser más claro al leer/escribir/leer página 0. El "read_page"; comando simplemente vuelca la página especificada (en decimal). El "write_byte"; la función es un poco rara, como los parámetros especifican un número de página, un desplazamiento en esa página y luego el byte. Desde no hay registro de 32 bits nativo en el Atmega 16-bit, no molestaba haciendo lógica traducción física, pero tendrás que tener en cuenta esta traducción en algún momento. De todos modos, observe que el tercer byte de la página cero ahora es "08h".
Yo pude también emitieron "chip_erase;" y luego "read_page 0;" para ilustrar un ciclo de borrado, pero esperemos que usted consigue el cuadro.
Las funciones de bajo niveles comienzan con '_' y se denominan "_read_page" o "_write_page" o "_erase_chip". Estas funciones explícitamente la secuencia de los comandos de SPI en los diagramas de tiempo hoja de datos. Cada función se termina con una llamada a "not_busy()" para evitar la ejecución del procedimiento antes de que el chip ha completado su operación interna.
Editar (11 de marzo de 2014): hubo un problema con la función de bajo nivel de _read_page, me había olvidado tirar CS alta antes de que se baja al comienzo de la función, como las otras funciones. Esto significa que si _read_page es la primera función que se llame, CS puede ya no ser alta, sin una válida /CS 1-> _read_page 0 transición no funcionará correctamente, la primera vez que se llama. La segunda vez que funcionaría bien porque deja /CS 1. Pequeño pero molesto error.