aries

VS1003B procedury transmisji

Zapis do rejestru magistralą SCI

Na listingu pokazana została procedura zapisu do 16 bitowego rejestru magistralą SCI. Na początku procedura oczekuje na stan wysoki sygnału DREQ informujący o gotowości układu VS1003B. Podanie stanu niskiego na wyprowadzenie xCS, otwiera dostęp do magistrali SCI. Potem kontroler nadrzędny przesyła portem SPI komendę zapisu (wartość 0x02), adres rejestru i bajty ze starszymi i młodszymi bitami danej. Na koniec magistrala zostaje zamknięta.

		
//zapis do rejestru 16 bitowego
void Player1003::WriteSci(uint8_t addr, uint16_t data)
{
uint8_t bufor;

  // czekaj na stan wysoki sygnału DREQ
  while (HAL_GPIO_ReadPin(dreq_port, dreq_pin) ==GPIO_PIN_RESET);
  HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_RESET);//xCS stan niski
  bufor =0x02;                                       //komenda zapisu
  SPI_WysylanieDoVS1003B(&bufor, 1);                 //wysłanie kodu komendy do VS1003B
  bufor =addr;                                       //adres rejestru do zapisu
  SPI_WysylanieDoVS1003B(&bufor, 1);                 //wysłanie adresu rejestru SCI
  bufor =data >>8;                                   
  SPI_WysylanieDoVS1003B(&bufor, 1);                 //wysłanie 8 starszych bitów       
  bufor =0xff & data;
  SPI_WysylanieDoVS1003B(&bufor, 1);                 //wysłanie 8 młodszych bitów
  HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_SET);  //xCS stan wysoki
}
		
		

Odczyt zawartości rejestru magistralą SCI

Na listingu pokazana została procedura odczytu zawartości 16 bitowego rejestru poprzez magistralę SCI. Stan wysoki sygnału DREQ informuje o gotowości układu VS1003B. Po ustawieniu stanu niskiego na wyprowadzeniu xCS, można przesłać magistralą SPI z kontrolera sterującego komendę odczytu (wartość 0x03) i bajt adresu odczytywanego rejestru. Następnie czytane są dwa bajty ze starszymi i młodszymi bitami rejestru. Na koniec magistrala SCI jest zamykana ustawieniem wysokiego stanu na wyprowadzeniu xCS.

		
//odczyt z rejestru 16 bitowego
uint16_t Player1003::ReadSci(uint8_t addr)
{
uint16_t res;
uint8_t bufor;

  // czekaj na stan wysoki sygnału DREQ
  while (HAL_GPIO_ReadPin(dreq_port, dreq_pin) ==GPIO_PIN_RESET);
  HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_RESET);//xCS stan niski
  bufor =0x03;                                       //komenda odczytu
  SPI_WysylanieDoVS1003B(&bufor, 1);                 //wysłanie kodu komendy do VS1003B
  bufor =addr;                                       //adres rejestru do odczytu
  SPI_WysylanieDoVS1003B(&bufor, 1);                 //wysłanie adresu rejestru SCI
  SPI_OdbieranieZVS1003B(&bufor, 1);                 //odbiór H bajtu
  res =(uint16_t)bufor<<8;
  SPI_OdbieranieZVS1003B(&bufor, 1);                 //odbiór L bajtu
  res =res + bufor;
  HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_SET);  //xCS stan wysoki
  return res;//procedura zwraca 16 bitową zwartość rejestru
}
		
		

Przesłanie danych z pliku dźwiękowego magistralą SDI

Na listingu 3 pokazana została procedura przesłania poprzez wewnętrzną magistralę SDI fragmentu odtwarzanego pliku MP3 o rozmiarze do 32 bajtów. Tak jak poprzednio należy poczekać na stan wysoki sygnału DREQ i dopiero wtedy można ustawić stan niski na wyprowadzeniu xDCS otwierając dostęp do wewnętrznej magistrali SDI. Rozpoczyna się przesłanie bajtów danych, które są umieszczane w wewnętrznym buforze VS1003B. Po przesłaniu danych należy podać stan wysoki na xDCS zamykając magistralę SDI.

		
//przesłanie fragmentu danych pliku MP3
int Player1003::WriteSdi(const uint8_t *data, uint8_t bytes)
{
uint8_t i, bufor;

  if (bytes >32) return -1;//błąd, za długa transmisja
  // czekaj na stan wysoki sygnału DREQ
  while (HAL_GPIO_ReadPin(dreq_port, dreq_pin) ==GPIO_PIN_RESET);
  HAL_GPIO_WritePin(dcs_port, dcs_pin, GPIO_PIN_RESET);//xDCS stan niski
  for (i=0; i < bytes; i++)
  {
    bufor =*data;
    data++;
    SPI_WysylanieDoVS1003B(&bufor,1);
  }
  HAL_GPIO_WritePin(dcs_port, dcs_pin, GPIO_PIN_SET); //xDCS stan wysoki
  return 0;
}