Как использовать 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.