SPI Read User Space Issue

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

SPI Read User Space Issue

831件の閲覧回数
Dhevan
Contributor IV

Hi,

     Board = IMX8MM Custom Board

     In our user space code spi accelerometer reading 14k data per second.

     SPI Clock Speed 3.5MHZ.

     Our issue is every second we not able to read 14k fixed data it will be varying (13k to 20k)

     We want to get stable 14k data per second.

     Please suggest to get stable data count in user space code.

     Note : Microcontroller (imxrt 1064) we can able to read stable count data

Regards,

 Vasu

 

ラベル(1)
0 件の賞賛
返信
2 返答(返信)

823件の閲覧回数
Zhiming_Liu
NXP TechSupport
NXP TechSupport

Hi

 

You can refer thsi spi test code https://source.codeaurora.org/external/imx/imx-test/tree/test/mxc_spi_test/mxc_spi_test1.c?h=imx_5.4...

 

 

static const char   *spiDev0  = "/dev/spidev0.0" ;
static const char   *spiDev1  = "/dev/spidev0.1" ;
static  uint8_t     spiBPW   = 8 ;
static  uint16_t    spiDelay = 0 ;
 
static uint32_t     spiSpeeds [2] ;
static int          spiFds [2] ;
/*
* SPIDataRW:
*    Write and Read a block of data over the SPI bus.
*    Note the data ia being read into the transmit buffer, so will
*    overwrite it!
*    This is also a full-duplex operation.
*********************************************************************************
*********************************************************************************/
int SPIDataRW (int channel, unsigned char *tx_data, unsigned char *rx_data, int len)
{
  int i = 0;
  struct spi_ioc_transfer spi ;
  channel &= 1 ;
  memset (&spi, 0, sizeof (spi)) ;
  spi.tx_buf        = (unsigned long)tx_data ;
  spi.rx_buf        = (unsigned long)rx_data ;
  spi.len           = len ;
  spi.delay_usecs   = spiDelay ;
  spi.speed_hz      = spiSpeeds [channel] ;
  spi.bits_per_word = spiBPW ;
return ioctl (spiFds [channel], SPI_IOC_MESSAGE(1), &spi) ; 
}
/*
* SPISetupMode:
*    Open the SPI device, and set it up, with the mode, etc.
*********************************************************************************
*********************************************************************************/
 
int SPISetupMode (int channel, int speed, int mode)
{
  int fd ;
 
  if ((fd = open (channel == 0 ? spiDev0 : spiDev1, O_RDWR)) < 0)
  {
    printf("Unable to open SPI device: %s\n", strerror (errno)) ;
    return -1;
  }
  spiSpeeds [channel] = speed ;
  spiFds    [channel] = fd ;
  
  if (ioctl (fd, SPI_IOC_WR_MODE, &mode) < 0)                     
  {                                                               
    printf("Can't set spi mode: %s\n", strerror (errno)) ;         
    return -1;                                                    
  }                                                               
  if (ioctl (fd, SPI_IOC_RD_MODE, &mode) < 0)                     
  {                                                               
    printf("Can't get spi mode: %s\n", strerror (errno)) ;        
    return -1;                                                 
  }    
  

  if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0)          
  {                                                               
    printf("Can't set bits per word: %s\n", strerror (errno))  ;  
    return -1;                                                    
  }                                                              
  
  if (ioctl (fd, SPI_IOC_RD_BITS_PER_WORD, &spiBPW) < 0)          
  {                                                               
    printf("Can't get bits per word: %s\n", strerror (errno))  ;  
    return -1;                                                   
  }   
  
/*
* Set SPI RW speed*********************************************************************************
*/
  if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0)
  {
    printf("Can't set max speed hz: %s\n", strerror (errno));
    return -1;
  }
  
  if (ioctl (fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0)
  {
    printf("Can't get max speed hz: %s\n", strerror (errno));
    return -1;
  }
  
  return fd ;
}
/*
* SPISetup:
*    Open the SPI device, and set it up, etc. in the default MODE 0
*********************************************************************************
*********************************************************************************/
int SPISetup (int channel, int speed)
{
  return SPISetupMode (channel, speed, 0) ;
}

BR

Zhiming

0 件の賞賛
返信

816件の閲覧回数
Dhevan
Contributor IV

Hi @Zhiming_Liu,

      SPI user space code working fine.

      Our issue reading 14k data per second.

      In parallel we are reading two spi interface at same time 14k data one spi and one more spi 1k data.

      If we read two interface parallel data loss is happening and reading data count also different (14k to 20k) but its not stable count.

      Our industrial processor contains 2 core

      Did you have any solution to avoid data loss ?

      Possible M4 to read one spi data linux user space read one more spi interface to avoid data loss ?

0 件の賞賛
返信