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
}
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
}
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;
}