Existe uma biblioteca I2C

12

Existe uma biblioteca simples para conversar com o I2C para C ++? Eu encontrei algumas coisas para python e Java, mas eu queria C ++. Eu esperava que alguém portasse a biblioteca do Arduino Wire para poder usar o código que já escrevi para o Arduino.

Kevin
fonte
1
Discordo ... Estou realmente perguntando se a biblioteca de fiação do Arduino foi portada para o Pi para que eu possa usar o código escrito para o Arduino facilmente no Pi. Não parece ser esse o caso, portanto qualquer biblioteca equivalente e fácil de usar seria legal. No entanto, isso também parece não existir, então fiquei com o uso do código i2c-dev.
Kevin

Respostas:

7

Há um cabeçalho i2c-dev no espaço de usuário do Linux. Não me lembro se esse cabeçalho é enviado com o pacote lm-sensores ou se ele precisa ser instalado a partir da fonte. Eu verificaria o repositório de pacotes da sua distribuição. O xGoat tem um bom artigo sobre preparação e uso.

#include <linux/i2c-dev.h>
/*
  Including i2c-dev header will allow the following I2C SMBus functions
  - i2c_smbus_access
  - i2c_smbus_write_quick
  - i2c_smbus_read_byte
  - i2c_smbus_write_byte
  - i2c_smbus_read_byte_data
  - i2c_smbus_write_byte_data
  - i2c_smbus_read_word_data
  - i2c_smbus_write_word_data
  - i2c_smbus_process_call
  - i2c_smbus_read_block_data
  - i2c_smbus_write_block_data
  - i2c_smbus_read_i2c_block_data
  - i2c_smbus_write_i2c_block_data
  - i2c_smbus_block_process_call
*/

O código fonte do i2c-tools ( download ) é um bom exemplo C. Eu já vi algumas C++bibliotecas simples agrupando essas funções. Eu recomendo criar sua própria biblioteca para atender às suas necessidades. Outros ótimos exemplos podem ser encontrados no Github, como esta biblioteca I2CBus

emcconville
fonte
5

Comecei a usar a biblioteca pigpio e estou muito impressionado. Eu gosto especialmente do modo bit bang, pois permite que você use dois pinos GPIO como interface I2C, desde que tenham resistores de pullup. Se você estiver usando um PI2, não há muita desvantagem em bit bang, pois você tem 4 CPUs. O bom dos comandos bit bang é que eles recebem uma lista de bytes de comando "endereço, gravação, dados, leitura, início, parada" de comando, para que você possa executar várias E / Ss com uma única chamada. Foi a única coisa que descobri que executa transações de início repetidas de maneira confiável, exigidas por muitos dispositivos que recebem um número de registro no início de um comando de leitura. A biblioteca está bem documentada e fácil de usar.

Abaixo está o programa de teste que lê os registros de temperatura no MAX31785. 4 define o endereço com o próximo byte, 2 = início, 7 = gravação, que é seguido por uma contagem de bytes e bytes de dados, 3 = parada, 6 = leitura, que é seguido por uma contagem de bytes. A chamada retorna todos os bytes de dados lidos junto com o número de bytes.

#include <stdio.h>
#include <stdlib.h>
#include <pigpio.h>

#define MAX31785_TEMP_REG 0x8D
#define MAX31785_TEMP0 6
#define MAX31785_TEMP_INT 12
#define PAGE_REG_OFFSET 6  // Offset in CmdBuf of the page register write value


main( int argc, char *argv[])
{
    int  rcnt;
    char ReadBuf[256];
    char CmdBuf[] = {4, 0x52,  // Chip address
                       2, 7, 2, 0x00, MAX31785_TEMP0, 3,    // Write page register to select temperature sensor
                       2, 7, 1, MAX31785_TEMP_REG, 2, 6, 2, 3, // Read temperature register
                       0 // EOL
                       };

  if (gpioInitialise() < 0) return 1;

  // Open bit banging I2C on standard I2C pins
  if (bbI2COpen(2, 3, 100000)) return 1;

  while(1)
  {
    // Loop over the 7 temp sensors
      for(CmdBuf[PAGE_REG_OFFSET] = MAX31785_TEMP0; CmdBuf[PAGE_REG_OFFSET] <= MAX31785_TEMP_INT; CmdBuf[PAGE_REG_OFFSET]++)  
      {     
    // Read the temp reg for the current page
          rcnt = bbI2CZip(2, CmdBuf, sizeof(CmdBuf), ReadBuf, sizeof(ReadBuf));

          if(rcnt == 2)
            // Print out degrees C
            printf("%2.1f ", (short)(((ReadBuf[1] << 8) | ReadBuf[0]) + 50)/100.0 );
          else
            printf("Error: %d\n", rcnt);
      }

    printf("\n");
    fflush(stdout);
    sleep(1);
  }

  bbI2CClose(2);

  gpioTerminate();
}
crj11
fonte
Obrigado por postar seu exemplo de código. Foi o melhor exemplo que pude encontrar e me colocou no caminho certo. O único problema que tive com isso foi usar a biblioteca pigpiod_if.h requer que o código seja executado como sudo, o que não era aceitável para o meu projeto. Eu fui capaz de mudar para a biblioteca pigpiod_if2.h e fazer alguns ajustes e funcionou como um campeão.
Richard Teel 24/03
2

Como mencionado por emcconville, existe um cabeçalho i2c-dev no espaço de usuário do Linux ( #include <linux/i2c-dev.h>). Além disso, você precisa de um dispositivo de caracteres para ler. Isso pode ser feito carregando os módulos corretos. i2c_bcm2708para o motorista de baixo nível e i2c-devpara gerar o personagem deciva para os ônibus. Aplique ...

sudo modprobe -r i2c_bcm2708
sudo modprobe i2c_bcm2708 baudrate=32000

para carregá-los em tempo real. Aplique ...

sudo sh -c 'echo "i2c-dev" >> /etc/modules'
sudo sh -c 'echo "options i2c_bcm2708 baudrate=<your preferred baudrate>\n" > /etc/modprobe.d/custom.conf

e unblacklist i2c_bcm2708em /etc/modprobe.d/raspi-blacklist.conffazer /dev/i2c-0e /dev/i2c-1mostrar-se permanentemente.

A partir de agora você pode seguir as dicas de como usar o I²C del maestro.

Eu prefiro esse método porque é platformagnótico. Você também pode usar linux/i2c-dev.hcom outros dispositivos, desde que exista um driver I²C. O WiringPi está vinculado ao rPi.

Saudações

ATUALIZAR:

Esta informação está obsoleta. Verifique esta postagem para o uso de árvores de dispositivos.

ManuelSchneid3r
fonte
0

Existe um WiringPi que eu acho que faz exatamente o que você deseja. Também existem wrappers para Pascal, Java, Python, Perl, TCL e Ruby. Além disso, alguém pode querer explorar links semelhantes:

  1. http://www.susa.net/wordpress/2012/06/raspberry-pi-pcf8563-real-time-clock-rtc/
  2. http://binerry.de/post/26685647322/raspberry-pi-and-i2c
  3. http://www.lazarus.freepascal.org/index.php?topic=17404.0
avra
fonte
Não ... olhe novamente, ele não faz i2c, apenas funções básicas de pinos. O projeto é um tanto enganado. Seu primeiro link possui um bom código c, mas não é um invólucro simples para fazer o i2c como no Arduino. Provavelmente vou ter que escrever eu mesmo.
kevin
3
Biblioteca WiringPi I2C: fiaçãopi.com
avra