Argon (28.02.2009 17:15, просмотров: 173) ответил yakuzaa на а можно еще процедуру SCI_write посмотреть, пожалуйста?
Прога основана на scmRTOS, для отправки SDI и SCI данных служат разные процессы.
OS_PROCESS void TSCI_Process::Exec()
{
byte SCI_operation;
byte SCI_register;
SCIBuffer.clear();
for(;;)
{
SCI_flag.Wait();
while(SCIBuffer.get_count())
{
VS1033_Mutex.Lock();
SCI_operation = SCIBuffer.get();
SCI_register = SCIBuffer.get();
VS1033_XCS_LOW();
SPI_Write_Read(SCI_operation);
SPI_Write_Read(SCI_register);
if(SCI_operation == WRITE_OP)
{
SPI_Write_Read(SCIBuffer.get());
SPI_Write_Read(SCIBuffer.get());
}
if(SCI_operation == READ_OP)
{
SCI_Register_Content = SPI_Write_Read(0xff);
SCI_Register_Content = (SCI_Register_Content << 8) | SPI_Write_Read(0xff);
SCI_Read_flag.Signal();
}
Sleep(SCI_Delay_table[SCI_register]); //задержка, приблизительно равная данной в даташите, параграф 8.7
VS1033_XCS_HIGH();
VS1033_Mutex.Unlock();
Sleep(50); //минимальный интервал между SCI-командами.
}
}
}
void SCI_Write(byte sci_register, word data)
{
while(SCIBuffer.get_count()) General_Delay.Wait(10); //ожидание освобождения буфера SCI
SCIBuffer.put(WRITE_OP);
SCIBuffer.put(sci_register);
SCIBuffer.put(data>>8);
SCIBuffer.put(data&0xff);
SCI_flag.Signal(); //всегда д.б. до SCI_SDI_flag.Signal
}