oktava-studio.ru

Использование SPI с LPC2000



Протокол 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.

система комментирования CACKLE

Автор: амдф
Дата: 10.03.2013







Copyright © 2016- Программирование Native API и расширенные возможности NTFS
По вопросам сотрудничества и другим вопросам по работе сайта пишите на cleogroup[собака]yandex.ru