He escrito un código de controlador SPI simple para enviar y recibir un solo byte. Ahora estoy tratando de escribir un controlador que pueda transmitir / recibir múltiples bytes en una transacción. Estoy planeando usar esto con el módulo de radio nRF24L01 que tiene una FIFO-s de 32 bytes, por lo que necesito poder escribir y leer múltiples bytes.
He escrito el siguiente código (no incluye la inicialización de AVR en modo maestro SPI):
//Function to send and receive multiple bytes of data
uint16_t * spi_tx_multibyte(unsigned char cmd_or_adr, int n, uint16_t *data_ptr_array) //first byte is the register address or command byte, the following is data byte
{
PORTB &= ~SS_MASK; // bring SS pin low to signal start of SPI transaction
//send a command or address byte first
SPDR = cmd_or_adr; //write byte into SPI transmit register
while(!(SPSR & (1<<SPIF) )); //Wait until SPI transmission complete
int i; //for loop variable
//send data bytes
for (i=0;i<n;i++)
{
SPDR = data_ptr_array[i]; //write the value of the variable where pointer points to into SPI transmit register
while(!(SPSR & (1<<SPIF) )); //Wait until transmission complete
data_ptr_array[i] = SPDR; //write received bytes into variable where pointer array points to
}
PORTB |= SS_MASK; //Bring SS pin back high after transaction has completed
return data_ptr_array; // return the received values in array of pointers
}
Código principal (ejemplo de uso):
int main(void)
{
volatile uint16_t data_ptr_array[]= {0xFF,0xFF,0xFF,0xFF,0xFF}; // array values
spi_init_master(); //initialize SPI as master
while(1)
{
spi_tx_multibyte(0xA0,5,data_ptr_array); //write into nRF TX FIFO
}
}
Cuando compilo obtengo la siguiente advertencia:
Advertencia 1 que pasa el argumento 3 de 'spi_tx_multibyte' descarta 'volatile' calificador del puntero tipo de destino [habilitado de forma predeterminada]
La advertencia 3 que pasa el argumento 3 de 'spi_tx_multibyte' descarta 'volatile' calificador del puntero tipo de destino [habilitado de forma predeterminada]
He buscado en la pila y en Google, pero todavía no pude entender lo que significa esta advertencia.