Имеется команда, например "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МГц. Кейл.