Пример #1
0
int SPI_transfer(int spidev_fd, void *tx_buffer, void *rx_buffer, int n_words) {
  uint8_t bits_per_word;
  uint32_t n_bytes;
  struct spi_ioc_transfer transfer;
  bits_per_word = SPI_getBitsPerWord(spidev_fd);
  if (bits_per_word < 0) return bits_per_word;
  n_bytes = (uint32_t) (((float) (bits_per_word * n_words)) / 8.0 + 0.5);
  if (!n_bytes) return 0;
  if (n_bytes > MAX_TRANSFER_SIZE) n_bytes = MAX_TRANSFER_SIZE;

  transfer.tx_buf = (uint64_t*) tx_buffer;
  transfer.rx_buf = (uint64_t*) rx_buffer;
  transfer.len = n_bytes;
  transfer.speed_hz = 0;
  transfer.delay_usecs = 0;
  transfer.bits_per_word = bits_per_word;
  transfer.cs_change = 0;
  if (ioctl(spidev_fd, SPI_IOC_MESSAGE(1), &transfer) < 0) return -1;
  return (n_bytes<<3) / bits_per_word;
}
Пример #2
0
static PyObject *SPIDev_open(SPIDev *self, PyObject *args, PyObject *kwds) {
  self->spidev_fd[0] = SPI_open(self->bus, 0);
  if (self->spidev_fd[0] < 0) {
    PyErr_SetString(PyExc_IOError, "could not open spidev");
    return NULL;
  }
  self->bits_per_word = SPI_getBitsPerWord(self->spidev_fd[0]);
  if (self->bits_per_word <= 8) {
    self->bytes_per_word = 1;
  }
  else if (self->bits_per_word <= 16) {
    self->bytes_per_word = 2;
  }
  else if (self->bits_per_word <= 32) {
    self->bytes_per_word = 4;
  }
  if (self->mode_3wire) {
    SPI_enable3Wire(self->spidev_fd[0]);
  }
  Py_INCREF(Py_None);
  return Py_None;
}