Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Делал проект для ADuC7024. Но очень специфический.

Отправлено Dir 22 апреля 2009, г. 23:04
В ответ на: Посмотрел нету там (( отправлено пользователем skyspark 22 апреля 2009, г. 21:55

Вот выдрал из проекта инициализацию и чтение/запись. Мог что-то забыть.
Используется внешний генератор 32МГц, для твоей частоты пересчитай параметры. Среда IAR5.30, чистый "C".

// Определение бит UART
#define COM_WLS 0 // Word Length Select: 0 - 5, 1 - 6, 2 - 7, 3 - 8
#define COM_STOP 2 // Stop-bit: 0 - 1, 1 - 1,5 или 2
#define COM_PEN 3 // Parity Enable
#define COM_EPS 4 // Even Parity Select
#define COM_SP 5 // Stick Parity
#define COM_BRK 6 // Set Break
#define COM_DLAB 7 // Divisor Latch Access

#define COM_DR 0 // Data Ready
#define COM_OE 1 // Overrun Error
#define COM_PE 2 // Parity Error
#define COM_FE 3 // Framing Error
#define COM_BI 4 // Break Error (Input)
#define COM_THRE 5 // COMxTX & COMxRX Empty
#define COM_TEMP 6 // COMxTX Empty

#define COM_DTR 0 // Data Terminal Ready
#define COM_RTS 1 // Request To Send
#define COM_LOOPBACK 4 // Loop Back

#define COM_DCTS 0 // Delta Clear To Send
#define COM_DDSR 1 // Delta Data Set Ready
#define COM_TERI 2 // Tralling Edge Ring Indicator
#define COM_DDCD 3 // Delta Data Carrier Detect
#define COM_CTS 4 // Clear To Send
#define COM_DSR 5 // Data Set Ready
#define COM_RI 6 // Ring Indicator
#define COM_DCD 7 // Data Carrier Detect

#define COM_FBN 0 // N (Fractional Divider) = 0...2047
#define COM_FBM 11 // M (Fractional Divider) = 1...3, 0 = 4
#define COM_FBEN 15 // Fractional Baud Rate Generator Enable Bit

#define COM_NAB 0 // Network Address Bit
#define COM_NABP 1 // Network Address Bit (Interrupt Polarity Bit)
#define COM_ETD 2 // Transmitter Pin Driver Enable Bit
#define COM_E9BD 3 // Word Length
#define COM_ENI 4 // Network Interrupt Enable Bit
#define COM_E9BR 5 // 9-bit Receive Enable Bit
#define COM_E9BT 6 // 9-bit Transmit Enable Bit
#define COM_ENAM 7 // Network Address Mode Enable Bit

void init_UART(void)
{
COMCON0 = 1<<COM_DLAB;
COMDIV2 = (1<<COM_FBEN)|(1<<COM_FBM)|(174<<COM_FBN); // 115200bps (M = 1, N = 174)
COMDIV1 = 0;
COMDIV0 = 0x08;
COMCON0 = (1<<COM_STOP)|(3<<COM_WLS); // 8bits, 2 stop-bit, no parity
COMIEN0 = 0;
}

А вот эта штука в прерывании по таймеру (50мкс) работала с UART. Все остальное было протокольное а-ля Code Vision AVR, переработанное для нужд ADuCa

BYTE status, data;
// Прием по UART (связь с ПК)
status = COMSTA0;
if (status & (1 << COM_DR))
{
data = COMRX;
if (!(status & ((1<<COM_OE)|(1<<COM_PE)|(1<<COM_FE)|(1<<COM_BI))))
{
rx_buffer[rx_wr_index] = data;
if (++rx_wr_index == RX_BUFFER_SIZE)
rx_wr_index = 0;
if (++rx_counter == RX_BUFFER_SIZE)
stateMU.rx_buffer_overflow = 1;
delayRXD = TIME_OUT_RS422;
}
}
else if (delayRXD)
delayRXD--;
else // инициализация на прием нового пакета
{
rx_counter = 0;
rx_wr_index = 0;
stateMU.rx_time_out = 1;
}
// Передача по UART (связь с ПК)
if (status & (1 << COM_TEMP))
{
if (tx_counter)
{
tx_counter--;
COMTX = tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE)
tx_rd_index=0;
}
}

Еще делал такое же для двух UARTов в ADuC7128. Там уже стандартный часовой кварц.
Все в общем-то самопальное, но уже давно успешно работает в серийных изделиях.


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 56:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru