реклама на сайте
подробности

 
 
> 9-битовый UART на LPC2378. Миф?
M0HAX
сообщение Sep 7 2010, 06:06
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 22-09-08
Пользователь №: 40 378



Неожиданно столкнулся с проблемой включения 9-битового режима работы UART на данном АРМ. Думал, что такой режим по дефолту есть. Но в даташите нигде не нашел упоминание того, что UART на LPC2378 можно использовать в режиме "Master-Slave".((( Например, в LPC1114 9-ый бит в адресном байте устанавливается через Parity bit, при работе в режиме slave при приеме 9-ого бита возникает Parity Error, но там устанавливается через спец.регистр режим MultiDrop.
Подскажите, возможно ли на 2378 принимать и посылать адресные байты и если можно, то как?
Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Nixon
сообщение Sep 7 2010, 10:14
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



Ничего не понял из вашего сообщения, но на всякий случай скажу что работать с 9-битными посылками можно. И именно через parity.
вот вам пример
CODE
/* Модуль UART3 */
#include <LPC23xx.H>
#include <rtl.h>
#include "global.h"
#include "uart3.h"
#include "irq.h"

// указатель на mailbox для UART3 модуля
u32* uart3_mbx;

/* Обработчик прерывания UART3 */
void uart3_isr (void) __irq
{
u32 tmp = U3LSR;

tmp = ((tmp & 0x04) << 6) + U3RBR;

if (isr_mbx_check(uart3_mbx) != 0) isr_mbx_send(uart3_mbx, (void*)tmp); // если uart3_mbx не переполнен послали в uart2_mbx принятый байт и четность
VICVectAddr = 0; // завершили прерывание
}

/* Функция инициализации UART3 */
/* Параметры : baudrate - скорость обмена */
/* Результат : mailbox - указатель на ящик обмена */
void uart3_init(u32 baudrate, u32* mailbox)
{
uart3_mbx = mailbox; // сохранили указатель на mailbox

PINSEL0 &= ~((u32)3 << 0);
PINSEL0 |= (u32)2 << 0; // P0.0 включен как TXD3
PINSEL0 &= ~((u32)3 << 2);
PINSEL0 |= (u32)2 << 2; // P0.1 включен как RXD3

U3LCR = 0x2B; // 8 бит, с четностью = 1, 1 стоп бит
U3LCR |= 0x80; // установили DLAB
U3DLM = ((PCLK / 16) / baudrate) / 256; // установили baudrate
U3DLL = ((PCLK / 16) / baudrate) % 256;
U3LCR &= ~0x80; // сбросили DLAB
U3FCR = 0x07; // разрешаем и сбрасываем TX и RX FIFO

set_irq_isr(UART3_INT, (void *)uart3_isr, 0); // установка вектора прерывания UART2

U3IER = UART_IER_RBR; // разрешили прерывания по приему
}


/* Функция передачи блока данных по UART2 */
/* Параметры : data - передаваемый байт данных */
/* nine - девятый бит данных */
void uart3_send (u08 data, u08 nine)
{
if (nine) U3LCR = 0x2B;
else U3LCR =0x3B;
U3THR = data; // передача данных из буфера
while (!(U3LSR & UART_LSR_TEMT)); // ожидание завершения текущей передачи
}

На работу с OS не обращайте внимания


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 12:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01365 секунд с 7
ELECTRONIX ©2004-2016