Как использовать ATMega USART в синхронном режиме с помощью вывода XCK

Я работаю над проектом с ATMega64, и у меня проблема с одним из интерфейсов USART, который будет работать в синхронном режиме.

при попытке отправить тестовые данные, например:

char data[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};

все идет нормально, но пытаюсь с:

char data[10] = {'1', '2', '3', 'A', 'B', '6', 'C', '8', '9'};

вызывает проблему с non-numberсимволы. похоже, моя проблема в битах MSB, которые не могут быть переданы должным образом.

Поскольку эта ошибка возникает на каждом letterсимвол, который я забыл установить / проверить. поскольку я какое-то время не работал с этим типом микроконтроллера, возможно, я пропустил некоторые настройки.

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

вот мои синхронные конфигурации:

Мастер-микро (выход XCK):

PORTD = 0b00000100;
DDRD  = 0b00101000;

// USART1 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART1 Receiver: On
// USART1 Transmitter: On
// USART1 Mode: Sync. Master UCPOL=1
// USART1 Baud Rate: 2400
UCSR1A=(0<<RXC1) | (0<<TXC1) | (0<<UDRE1) | (0<<FE1) | (0<<DOR1) | (0<<UPE1) | (0<<U2X1) | (0<<MPCM1);
UCSR1B=(1<<RXCIE1) | (0<<TXCIE1) | (0<<UDRIE1) | (1<<RXEN1) | (1<<TXEN1) | (0<<UCSZ12) | (0<<RXB81) | (0<<TXB81);
UCSR1C=(1<<UMSEL1) | (0<<UPM11) | (0<<UPM10) | (0<<USBS1) | (1<<UCSZ11) | (1<<UCSZ10) | (1<<UCPOL1);
UBRR1H=0x08;
UBRR1L=0xFF;

Подчиненный микро (вход XCK):

PORTD = 0b00100100;
DDRD  = 0b00001000;

// USART1 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART1 Receiver: On
// USART1 Transmitter: On
// USART1 Mode: Sync. Slave UCPOL=1
UCSR1A=(0<<RXC1) | (0<<TXC1) | (0<<UDRE1) | (0<<FE1) | (0<<DOR1) | (0<<UPE1) | (0<<U2X1) | (0<<MPCM1);
UCSR1B=(1<<RXCIE1) | (0<<TXCIE1) | (0<<UDRIE1) | (1<<RXEN1) | (1<<TXEN1) | (0<<UCSZ12) | (0<<RXB81) | (0<<TXB81);
UCSR1C=(1<<UMSEL1) | (0<<UPM11) | (0<<UPM10) | (0<<USBS1) | (1<<UCSZ11) | (1<<UCSZ10) | (1<<UCPOL1);

проблема повторяется точно на каждой итерации, поэтому я не думаю, что эта потеря данных связана с проблемой подключения.

или, может быть, в синхронном режиме я всегда должен отправлять запасной бит и использовать 9 бит для 8-битных данных. имеет ли это значение?

Я использую CodeVisionAVR в качестве компилятора, но также будет полезен любой другой код на языке C.

0 ответов

Другие вопросы по тегам