Estoy tratando de enviar una cantidad constante y grande de bytes con SPI desde un sistema integrado Linux - am335x (Beaglebone: pocketbeagle version). La cosa es que estoy tratando de aumentar su tasa de transferencia.
Actualmente, estoy accediendo a SPI a través del espacio de usuario con la siguiente configuración en spidev (llamadas ioctl):
// SPI init -- (const char *device, int mode, int bits, int speed)
retv = spi_bus.spi_init(LCD_SPI_DEVICE,0,8,100000000);
Y esta es mi función de escritura:
// write data to SPIdev
int SPI::spi_write(const char *tx_buf, int len)
{
int retv;
this->xfer.tx_buf = (uint64_t) tx_buf; // output buffer
this->xfer.rx_buf = (uint64_t) 0; // input buffer
this->xfer.len = (uint32_t) len; // length of data to write
retv = ioctl(this->fd, SPI_IOC_MESSAGE(1), &this->xfer);
if (retv < 0)
{
printf("error in spi_write(): ioctl(SPI_IOC_MESSAGE(1)) return %d", retv);
return SPI_ERR_WRITE;
}
return retv;
}
Estoy intentando enviar 153 KB a la vez. ¡Pero es lento! No he medido el mb / s, pero incluso a su velocidad máxima (que creo que es de 48MHz) es lento.
Leí en algún lugar que se llama automáticamente al DMA cuando se usa el controlador mcSPI. Sin embargo, no estoy realmente seguro de que se aplique a los controladores de espacio de usuario como spidev.
Mi pregunta es: ¿Cómo puedo aumentar los datos de transferencia de MB / s para SPI?
Cosas en las que he pensado hasta ahora:
1) Busque un controlador kernel = space en lugar de usar spidev.
2) Aumenta la longitud de la palabra.
No estoy seguro, ¿qué recomendaría para aumentar significativamente la tasa de transferencia de SPI?