Имеется команда, например "u08 Play_CMD[]={0xFF,0x55,0x03,0x02,0x00,0x01,0xFA};" которую надо отправить через UART1 на МП3-плеер. Пытаюсь это сделать несколькими способами: 1. const char *puts(const char *string) { unsigned char ch; while ((ch = *string)) { putchar(ch); string++; } return string; }
int putchar(int ch) /* Write character to Serial Port */ { while (!(U1LSR & ULSR_THRE)) ; // wait for TX buffer to empty U1THR = ch; // put char to Transmit Holding Register return ch; }
2. const char *puts1(const char *string) { u08 i,l; l=3+string[2]; //string[2]-длина команды for (i=0;i<l;i++) { putchar(string[i]); }; return string; }
но происходит следующее - по первому способу - останавливается передача на 0х00, причем при отправке следующей команды, застрявшие байтики не пропихиваются на выход (ну оно и понятно - 0х00 - вроде как завершение строки). При втором способе - 0х00 проходит, но передается на 2 байта меньше, причем при последующей команде они пропихиваются., но застревают байтики от следующей команды... Причем пропихиваться может и при записи чего-либо в другой сериальный порт...
В чем могут быть грабли? с 0-вым юартом - также.
инится ЮАРТ:
void uart1Init(unsigned int baud) {
// setup Pin Function Select Register (Pin Connect Block) // make sure old values of Bits 0-4 are masked out and // set them according to UART0-Pin-Selection PINSEL0 |= 0x00050000; U1IER = 0x00; // disable all interrupts U1IIR = 0x00; // clear interrupt ID register U1LSR = 0x00; // clear line status register // set the baudrate - DLAB must be set to access DLL/DLM U1LCR = ULCR_DLAB_ENABLE; // set divisor latches (DLAB) U1DLL = (unsigned char)baud; // set for baud low byte U1DLM = (unsigned char)(baud >> 8); // set for baud high byte // set the number of characters and other // user specified operating parameters // Databits, Parity, Stopbits - Settings in Line Control Register U1LCR = (UART_8N1);// | ULCR_DLAB_ENABLE); // clear DLAB "on-the-fly" // setup FIFO Control Register (fifo-enabled + xx trig) U1FCR = UFCR_FIFO_ENABLE | UFCR_TX_FIFO_RESET | UFCR_FIFO_TRIG8; }
частота работы ядра - 60МГц. Кейл.
|