Смекни!
smekni.com

“Контроллер для организации сенсорной сети” (стр. 9 из 11)

Сигналы UART 0 CTS, RTS, TXD и RXD – мультиплексные соответственно с DIO4, 5, 6 и 7, а сигналы UART 0 CTS, RTS, TXD и RXD – соответственно с DIO17, 18, 19 и 20. Если использование сигналов CRT и RTS не требуется для работы с внешними устройствами, то они могут быть заблокированы через программное управление, что позволяет использовать штырьки в качестве DIOx.

13.1. Прерывания

Управление прерываниями блока UART осуществляется функцией vAHI_UartSetInterrupt (). Выработка прерывания может произойти в следующих случаях:

  • Полученные Данные Доступны: происходит, когда очередь данных в Rx FIFO достигает определенного уровня (уровень может быть задан как 1, 4, 8 или 14).
  • Передающий FIFO пуст: генерируется при чтении последнего символа из TX FIFO и начале его передачи.
  • Состояние Линии Получателя: установлен, когда выполняется одно из следующих условий: (1) Ошибка Четности - символ в заголовке приемного FIFO был получен с ошибкой четности, (2) Ошибка переполнения – FIFO заполнен и приемным сдвиговым регистром получен символ, (3) Ошибка кадровой синхронизации - у символа в заголовке приемного FIFO нет правильного стопового бита и (4), Прерывание Разрыва – происходит, если линия RXD находилась в низком состоянии на протяжении передачи всего символа. Источник прерывания определяется, используя u8AHI_UartReadLineStatus ().
  • Модемное Состояние: генерируется при изменении состояния линии CRT.

13.2. Применение UART

Следующий пример иллюстрирует подключение UART посредством 9 штырькового соединителя с PC. Программный комплект разработчика использует такой интерфейс для отладки JN513x. Поскольку уровень напряжения на штырьках JN513x не соответствует уровню линии RS232, используется согласующее устройство (рис. 29).

Рис. 29. Соединение JN513х с COM-портом PC.

13.3. Пример программы

Следующий пример демонстрирует конфигурирование UART0 и вывод сообщения «Hello World»

Текст программы:

/* Выбор uart0 */

vAHI_UartEnable(E_AHI_UART_0);

/* установка скорости передачи */

vAHI_UartSetClockDivisor(0, E_AHI_UART_RATE_38400);

/* установка четности, стартового бита, количество битов данных */

vAHI_UartSetControl(E_AHI_UART_0,

E_AHI_UART_EVEN_PARITY,

E_AHI_UART_PARITY_DISABLE,

E_AHI_UART_WORD_LEN_8,

E_AHI_UART_1_STOP_BIT,

E_AHI_UART_RTS_HIGH);

/* вывод сообщения */

char acstring[] = “Hello World”;

char *pcstring = acstring;

while (*pcstring)

{

vAHI_UartWriteData(E_AHI_UART_0, *pcstring);

pcstring++;

}

14. Двухпроводной последовательный интерфейс

JN513x включает промышленный стандартный двухпроводный синхронный последовательный интерфейс (SIF), который обеспечивает простой и эффективный метод обмена данными между устройствами. Для выполнения двунаправленной передачи данных система использует последовательную линию данных (SIF_D) и последовательную линию синхронизации (SIF_CLK) и обладает следующими особенностями:

  • Совместимый с I2C и SMbus внешними устройствами;
  • Программируемая частота синхронизации;
  • Задержка синхроимпульсов медленными устройствами;
  • Бит подтверждения;
  • Обнаружение занятости шины;
  • Поддержка 7 и 10 битовой адресации;

Регистр предмасштаба, установленный функцией vAHI_SiConfigure () , позволяет конфигурировать скорость интерфейса до 400kbit/s. Тактовый генератор обнаруживает задержку синхроимпульсов, создаваемую некоторыми подчиненными устройствами (рис. 30).

Рис. 30. Блок-схема двухпроводного последовательного интерфейса.

Контроллер Байта Команды обрабатывает трафик на уровне байта. Он считывает данные из Регистра Команды и переводит их в последовательности, основанные на передаче одного байта. Установка служебных битов начала, остановки, чтения, записи и подтверждения в регистре команды, используя vAHI_SiSetCmdReg (), позволяет управлять передачей данных по шине.

Сдвиговый регистр ввода - вывода содержит данные, связанные с текущей передачей. Во время операции чтения данные сдвигаются в этом регистре с линии SIF_D. Когда чтение закончено, байт копируется в приемный регистр и может быть прочитан, используя функцию u8AHI_SiReadData8 ().

Во время операции записи содержимое передающего регистра копируется в сдвиговый регистр с последующей выдачей на линию SIF_D. К передающему регистру можно обратиться, используя vAHI_SiWriteData8 (). Можно настроить интерфейс на генерацию прерывания после завершения передачи или приема байта, используя функцию vAHI_SiConfigure (). Если это нежелательно, можно опросить состояние интерфейса с помощью функций bAHI_SiPollBusy () и bAHI_SiPollTransferInProgress ().

Первый байт данных, переданный контроллером после бита начала содержит адрес подчиненного устройства. JN513x поддерживает 7-битовые и 10-битовые адреса, генерируя их в одном или двух процессах передачи адреса. Только устройство с соответствующим адресом ответит возвращением бита подтверждения. Используемый подчиненный адрес указывается в функции vAHI_SiWriteSlaveAddr ().

14.1. Подключение устройств

Линии синхронизации и данных SIF_D и SIF_CLK мультиплексны и линиями DIO 14 и 15 соответственно (рис. 31). Эти линии выполняют функции последовательного интерфейса при активизации его вызовом vAHI_SiConfigure (). Обе линии двунаправлены, соединены с источником питания с помощью внутренних резисторов номиналом 45КΩ. Использование внутренних резисторов задается программно. Однако рекомендуется использовать внешние резисторы номиналом 4.7 kΩ для надежности операций на высоких шинных скоростях, как показано на рисунке. Когда шина свободна, на обеих линиях лог «1». Выходные каскады подключенных к шине устройств должны быть с открытым стоком или открытым коллектором, чтобы выполнить функцию защитного-И. Количество соединяемых с шиной устройств ограничивается исключительно шинным пределом емкости 400pF.

Рис. 31. Подключение устройств к интерфейсу SIF.

14.2. Задержка синхроимпульсов

Ведомые устройства создавать задержку синхроимпульсов для замедления скорости передачи битов информации. После установки контроллером SIF_CLK в нулевое состояние, устройство может перехватить этот сигнал самостоятельной установкой SIF_CLK в нуль в течение необходимого периода и затем отпустить его. Если период перехвата SIF_CLK устройством больше периода установки SIF_CLK самим контроллером в нулевое состояние, получающийся на разнице двух периодов интервал времени и образует задержку синхроимпульсов. В течение этого интервала контроллер находится в состоянии ожидания: ждет отпускания SIF_CLK устройством и возвращения линии в единичное состояние. Иллюстрация процесса показана на рис. 32.

Рис. 32. Временные диаграммы задержки синхроимпульсов.

14.3. Пример программы

Двухпроводный протокол последовательного интерфейса реализован комбинацией аппаратных средств и программного обеспечения. Как правило, стандартный цикл коммуникации состоит из четырех частей:

  • Выработка сигнала начала;
  • Передача адреса подчиненного устройства;
  • Передача данных;
  • Выработка стопового сигнала.

Следующий пример кода показывает, как читать ряд значений от подчиненного устройства в буфер. Такой пример может найти реализацию при регистрации данных от датчика.

Заметим, что функция bAHI_SiPollTransferInProgress () используется для блокировки выполнения до полной передачи байта. Приложения более высокой производительности должны использовать прерывания для обнаружения конца передачи как фоновую задачу основной программы.

Формы сигналов иллюстрирующие работу функции bSIFRead (), показаны на рис. 33.

Рис. 33. Временные диаграммы работы SIF.


Текст программы:

PRIVATE bool_t bSIFRead(uint8 u8SlaveAddress, uint8 *pau8ReadBuffer, uint32

u32Length)

{

int i;

for (i=0; i<u32Length; i++)

{

/* указание адреса подчиненного устройства */

vAHI_SiWriteSlaveAddr(u8SlaveAddress, E_AHI_SI_SLAVE_RW_SET);

/* send read command */

vAHI_SiSetCmdReg(E_AHI_SI_START_BIT, E_AHI_SI_NO_STOP_BIT,

E_AHI_SI_NO_SLAVE_READ, E_AHI_SI_SLAVE_WRITE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK);

while(bAHI_SiPollTransferInProgress()); /* busy wait */

if (bAHI_SiPollArbitrationLost() | bAHI_SiPollRxNack())

{

/* release bus & abort */

vAHI_SiSetCmdReg(E_AHI_SI_NO_START_BIT, E_AHI_SI_STOP_BIT,

E_AHI_SI_NO_SLAVE_READ, E_AHI_SI_SLAVE_WRITE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK);

return FALSE;

}

if (i < u32Length - 1)

{

/* read and ack */

vAHI_SiSetCmdReg(E_AHI_SI_NO_START_BIT, E_AHI_SI_NO_STOP_BIT,

E_AHI_SI_SLAVE_READ, E_AHI_SI_NO_SLAVE_WRITE,

E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK);

}

else /* last byte */

{

/* read, stop, nack */

vAHI_SiSetCmdReg(E_AHI_SI_NO_START_BIT, E_AHI_SI_STOP_BIT,

E_AHI_SI_SLAVE_READ, E_AHI_SI_NO_SLAVE_WRITE, E_AHI_SI_SEND_NACK, E_AHI_SI_NO_IRQ_ACK);

}

while(bAHI_SiPollTransferInProgress()); /* busy wait */

if (bAHI_SiPollArbitrationLost())

{

/* release bus & abort */

vAHI_SiSetCmdReg(E_AHI_SI_NO_START_BIT, E_AHI_SI_STOP_BIT,

E_AHI_SI_NO_SLAVE_READ, E_AHI_SI_NO_SLAVE_WRITE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK);

return FALSE;

}

/* Store data read from device */

pau8ReadBuffer[i] = u8AHI_SiReadData8();

}

/* transfer complete */

vAHI_SiSetCmdReg(E_AHI_SI_NO_START_BIT, E_AHI_SI_STOP_BIT,

E_AHI_SI_NO_SLAVE_READ, E_AHI_SI_NO_SLAVE_WRITE, E_AHI_SI_SEND_ACK, E_AHI_SI_NO_IRQ_ACK);

return TRUE;

}

15. Аналоговая периферия

JN513x содержит группу аналоговых внешних устройств, позволяющих осуществить прямое подключение внешних датчиков, переключателей и исполнительных механизмов.

Имеются четыре входа АЦП, два ввода компаратора и два выхода ЦАП (рис. 34). К аналоговым штырькам ввода - вывода на JN513x могут быть приложены сигналы, не превышающие VDD1 более, чем на 0,3В.