hex.pp.ua

Использование 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


Разделы сайта
Главная
Блог
Native API
NTFS и ReFS
Микроконтроллеры
Справочник NTDLL
Коды NTSTATUS
Разное

Избранное
NTFS Stream Explorer
Native Shell
Тенгвар

Остальное
nvpnhcknn (архив)
English pages
Контакты

Ленты atom
Лента Atom сайта Лента Atom блога



При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт.