невозможно соединить beaglebonegreen с mcp3008 с помощью SPI - PullRequest
0 голосов
/ 19 января 2019

Я не могу связать mcp 3008 с beaglebone green. При попытке установить связь в режиме 0 (CPOL = 0 CPHA = 0) встроенная частота в dts установлена ​​на 1 МГц. вещи, которые я пробовал 1.Включаемое дерево устройств BB-SPI0-MCP3008-00A0.dts
на исполнение ls - al /dev/spidev1.* я получил crw-rw ---- 1 root spi 153, 0 Oct 7 16:40 /dev/spidev1.1

2. при исполнении cat /sys/kernel/debug/pinctrl/44e10800.pinmux/pingroups

группа: pinmux_bb_spi0_pins контакт 84 (PIN84) контакт 85 (PIN85) контакт 86 (PIN86) контакт 87 (PIN87)

Мой код ссылки следующий:

  #include <stdint.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <getopt.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <linux/types.h>
    #include <linux/spi/spidev.h>
    #define ARRAY_SIZE(array) sizeof(array) / sizeof(array[0])

    static const char *DEVICE = "/dev/spidev1.1"; 
    static uint8_t MODE = SPI_MODE_0; 
    static uint8_t BITS = 8; 
    static uint32_t CLOCK = 1000000; 
    static uint16_t DELAY = 5;

    /* * Ensure all settings are correct for the ADC */ 
    static int prepare(int fd) 
    {
      if (ioctl(fd, SPI_IOC_WR_MODE, &MODE) == -1) 
     {
       perror("Can't set MODE"); return -1; 
     }

    if (ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &BITS) == -1) 
   {
     perror("Can't set number of BITS"); 
     return -1;
   }

    if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &CLOCK) == -1)
     { 
        perror("Can't set write CLOCK"); 
        return -1; 
     }

     if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &CLOCK) == -1) 
    { 
      perror("Can't set read CLOCK"); return -1; 
    }

    return 0; 
    }

    /* * (SGL/DIF = 0, D2=D1=D0=0) */ 
    uint8_t control_bits_differential(uint8_t channel)
     { 
        return (channel & 7) << 4;
      }

     /* * (SGL/DIF = 1, D2=D1=D0=0) */ 
     uint8_t control_bits(uint8_t channel)
     { 
       return 0x8 | control_bits_differential(channel);
     }

    /* * Given a prep'd descriptor, and an ADC channel, fetch the * raw ADC 
     value for the given channel. */ 
     int readadc(int fd, uint8_t channel)
    { 
      uint8_t tx[] = {1, control_bits(channel), 0
    }; 
    uint8_t rx[3]={0,0,0};

    struct spi_ioc_transfer tr = { 
    .tx_buf = (unsigned long)tx, 
    .rx_buf = (unsigned long)rx, 
    .len = ARRAY_SIZE(tx),
    .delay_usecs = DELAY,
    .speed_hz = CLOCK, 
    .bits_per_word = BITS, };

     if (ioctl(fd, SPI_IOC_MESSAGE(1), &tr) == 1) 
     { 
        perror("IO Error"); 
        abort(); 
      }

      return ((rx[1] << 8) & 0x300) | (rx[2] & 0xFF);
      }

      int main(int argc, char **argv) 
     {

       int fd = open(DEVICE, O_RDWR);
       if (fd <= 0)
      { 
         printf("Device %s not found\n", DEVICE);
         return -1; 
       }

      if (prepare(fd) == -1)
       { return -1; }

      uint8_t i,radc=0;
      for(i = 0;i < 8;i++) 
      { printf("Channel %d: %d\n", i + 1, readadc(fd, i)); }

      close(fd);

      return 0; 
     }

после выполнения этого кода я получаю счет 1023 для любого приложенного напряжения, где я ожидаю счет 0 для входного напряжения 0 и так далее. Кто-нибудь может мне помочь? Можете ли вы сказать мне, где я делаю что-то не так? Что еще я должен учитывать при использовании SPI на beaglebone? Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 24 января 2019

решил, как это было предложено на другом форуме, это было связано с аппаратным обеспечением. Я должен поместить конденсатор 0.1 мкФ между vcc и gnd, где аналоговое заземление и цифровое заземление были общими.

...