Протокол SPI и микроконтроллеры серии LPC2000
Следующий код реализует 8-битный SPI для микроконтроллеров серии LPC2000, основанных на ядре ARM7TDMI-S. Две простые функции чтения и записи по SPI, и одна функция инициализации.
Вызываемые при инициализации функции set_pin_func это функции, устанавливающие какой-либо пин вывода микроконтроллера в режим SPI. Их вы прекрасно можете реализовать самостоятельно, так как управление портами ввода-вывода никогда не было сложной темой. Здесь я не показываю реализацию этих функций. Внутренности структуры dev тоже не указываю, в данном коде это несущественно.
Дальше в регистр SPCCR помещается значение, соответствующее работе SPI на частоте 1,875 МГц, рассчитанное, исходя из того, что частота периферии 30 МГц.
Содержимое регистра SPCR может быть сброшено, если возникнет ситуация сбоя (MODF). В этом случае содержимое регистра восстанавливается сразу после обнаружения сбоя.
// 8 бит, CPHA = 0, CPOL = 0, режим master #define SPCR_VALUE 0x20 /* ------------------------------------------------------------------------- */ int spi_init(struct spi_dev * dev, const s8 * config) { set_pin_func(dev->hw->pio_sck, dev->hw->pio_func); set_pin_func(dev->hw->pio_miso, dev->hw->pio_func); set_pin_func(dev->hw->pio_mosi, dev->hw->pio_func); REG(SPCCR) = 0x10; //30 Мгц / 16 = 1,875 МГц REG(SPCR) = SPCR_VALUE; return 0; } bool spi_put_byte(struct spi_dev * dev, u8 val) { u8 uFlags = 0; REG(SPDR) = val; while (!uFlags) uFlags = REG(SPSR); if (uFlags & SPI_MODF) { REG(SPCR) = SPCR_VALUE; } return (uFlags & SPI_SPIF); } bool spi_get_byte(struct spi_dev * dev, u8 *val) { u8 uFlags = 0; REG(SPDR) = 0; while (!uFlags) uFlags = REG(SPSR); *val = REG(SPDR); if (uFlags & SPI_MODF) { REG(SPCR) = SPCR_VALUE; } return (uFlags & SPI_SPIF); }Используемые в коде значения:
#define SPI_OK 0 typedef enum { SPI_ABRT = 0x08, SPI_MODF = 0x10, SPI_ROVR = 0x20, SPI_WCOL = 0x40, SPI_SPIF = 0x80 } SPI_FLAGS; #define DEV_ON io_clr(0, dev->pin_cs); // выбор устройства #define DEV_OFF io_set(0, dev->pin_cs); // отмена выбора устройства #define DEV_ON_PORT_1 io_clr(1, dev->pin_cs); // выбор устройства #define DEV_OFF_PORT_1 io_set(1, dev->pin_cs); // отмена выбора устройства
Список микроконтроллеров, для которых применим данный код: LPC2101, LPC2102, LPC2103, LPC2104, LPC2106, LPC2109, LPC2114, LPC2119, LPC2124, LPC2129, LPC2131, LPC2132, LPC2134, LPC2136, LPC2138, LPC2141, LPC2142, LPC2144, LPC2146, LPC2148, LPC2194, LPC2210, LPC2212, LPC2214, LPC2220, LPC2290, LPC2292, LPC2294, LPC2361, LPC2362, LPC2364, LPC2365, LPC2366, LPC2367, LPC2368, LPC2377, LPC2378, LPC2387, LPC2420, LPC2458, LPC2460, LPC2468, LPC2470, LPC2478.
Автор: амдф
Дата: 10.03.2013
Избранное
Остальное
Лента atom