Совершенно новичок в программной среде Atmel, обычно используют устройства MPLab / PIC, но для моего проекта мне нужно было создать маршрутизатор UART, способный соединять 6 устройств UART вместе, поэтому я выбрал микросхему SAMD20J16.До сих пор iv'e настраивал драйверы, используя ATMEL start с драйверами USART HAL_ASYNC для всех модулей USART.
Я получил устройство для записи во все 6 модулей USART и получил прерывание чтения для запуска, но я не могу прочитать из буфера usart.Сейчас я сократил его до минимального возможного кода, чтобы попытаться выяснить, почему он не работает, это, вероятно, простой упущение с моей стороны, но я искал в Интернете 2 дня и всю документацию, которую я могу найти, используяДрайверы HAL_ASYNC в ASF4 в лучшем случае ненадежны.
#include <atmel_start.h>
int main(void)
{
int nRead=0;
uint8_t rxPData;
/* Initializes MCU, drivers and middleware */
atmel_start_init();
//DECLARE UART STRUCTURTES
struct io_descriptor *uartD1;
usart_async_get_io_descriptor(&USART_0, &uartD1);
usart_async_enable(&USART_0);
struct io_descriptor *uartP;
usart_async_get_io_descriptor(&USART_1, &uartP);
usart_async_enable(&USART_1);
struct io_descriptor *uartD3;
usart_async_get_io_descriptor(&USART_2, &uartD3);
usart_async_enable(&USART_2);
struct io_descriptor *uartD4;
usart_async_get_io_descriptor(&USART_3, &uartD4);
usart_async_enable(&USART_3);
struct io_descriptor *uartS;
usart_async_get_io_descriptor(&USART_4, &uartS);
usart_async_enable(&USART_4);
struct io_descriptor *uartD2;io_write(uartP, (uint8_t *) "UART P\r\n", 8);
usart_async_get_io_descriptor(&USART_5, &uartD2);
usart_async_enable(&USART_5);
void uartP_callback(const struct usart_async_descriptor *const io_descriptor){
if(usart_async_is_rx_not_empty(uartP)){
io_write(uartP, (uint8_t *) "TEST P\r\n", 8);
nRead=io_read(uartP,&rxPData,6);
io_write(uartP,&rxPData,nRead);
}
}
usart_async_register_callback(&USART_1, USART_ASYNC_RXC_CB, uartP_callback);
while (1) {
}
}
Прямо сейчас наблюдаемое поведение происходит каждый раз, когда я отправляю пакет UART, он запускает прерывание, передает IF rx_buffer_is_not_empty и отправляет обратно "TEST P \ r \ n".Я добавил эту строку кода после некоторого тестирования, чтобы посмотреть, сработало ли прерывание.
Тем не менее, независимо от того, какой размер ввода я ему отправляю, он никогда не передает обратно какие-либо данные, которые были ему отправлены.
Сейчас я просто пытаюсь проверить, могу ли я получать и передавать по всем портам usart, окончательный код не будет передавать внутри входящих прерываний.