Как использовать ATMega USART в синхронном режиме с помощью вывода XCK - PullRequest
0 голосов
/ 25 мая 2020

Я работаю над проектом с 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 влияет на транзакцию.

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

Master micro (выход 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;

Slave micro (вход 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.

...