#include "system/LPC11xx.h" #include "spi.h" #include "uart.h" void rom_select() { LPC_GPIO0->MASKED_ACCESS[1 << 11] = 0x0; } void rom_deselect() { LPC_GPIO0->MASKED_ACCESS[1 << 11] = 0x800; } int rom_init() { char bytes[3]; rom_select(); spi_send_recv(0x9F); bytes[0] = spi_send_recv(0xFF); bytes[1] = spi_send_recv(0xFF); bytes[2] = spi_send_recv(0xFF); rom_deselect(); uart_printf("SPI ROM: %.2X %.2X %.2X\r\n", bytes[0], bytes[1], bytes[2]); return 0; } static void _wait_until_ready() { char b; for (;;) { rom_select(); spi_send_recv(0x05); b = spi_send_recv(0xFF); rom_deselect(); if (!(b & 1)) break; } } void rom_erase() { rom_select(); spi_send_recv(0x06); rom_deselect(); rom_select(); spi_send_recv(0xC7); rom_deselect(); _wait_until_ready(); } void rom_write_page(int page, char *data) { int i; rom_select(); spi_send_recv(0x06); rom_deselect(); rom_select(); spi_send_recv(0x2); spi_send_recv((page >> 8) & 0xFF); spi_send_recv(page & 0xFF); spi_send_recv(0x0); for (i = 0; i < 256; i++) spi_send_recv(data[i]); rom_deselect(); _wait_until_ready(); rom_select(); spi_send_recv(0x04); rom_deselect(); } void rom_read_page(int page, char *data) { int i; rom_select(); spi_send_recv(0x03); spi_send_recv(page >> 8); spi_send_recv(page); spi_send_recv(0x0); for (i = 0; i < 256; i++) data[i] = spi_send_recv(0xFF); rom_deselect(); }