collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: I2C por software em C/C++  (Lida 17152 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
I2C por software em C/C++
« em: 08 de Janeiro de 2010, 15:40 »
Boas,

Alguém já implementou I2C por software em C/C++

Preciso fazer lib disso para o ARM e não me está a apetecer reinventar a roda porque estou muito apertado de timings para outros projectos.
« Última modificação: 13 de Janeiro de 2012, 18:27 por Psycop »

Offline Tyran

  • Mini Robot
  • *
  • Mensagens: 293
Re: I2C por software em C/C++
« Responder #1 em: 08 de Janeiro de 2010, 15:48 »
Já mas foi em assembly 8051 ;D

Hmm, mas penso que no JeeLabs ele tem por lá qualquer coisa disso na biblioteca Ports penso eu de que...

EDIT: Acabei de ver na ports que tenho das libs do arduino e tem mesmo pelo menos assim rapidamente parece ser pois está a puxar ele as linhas :)
« Última modificação: 08 de Janeiro de 2010, 15:50 por Tyran »

Offline ricardo-reis

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.338
Re: I2C por software em C/C++
« Responder #2 em: 08 de Janeiro de 2010, 15:50 »
tiago, a lib wire do arduino faz tudo o k precisas de i2c, dá uma olhada nisso.. ;)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: I2C por software em C/C++
« Responder #3 em: 08 de Janeiro de 2010, 15:51 »
Tenho estado a ver mas ela baseia-se na twi.c e está demasiado orientada à arquitectura avr, creio que até utiliza i2c no avr por hardware em vez de implementar td em software.

Obrigado pelas ajudas.

Offline Tyran

  • Mini Robot
  • *
  • Mensagens: 293
Re: I2C por software em C/C++
« Responder #4 em: 08 de Janeiro de 2010, 16:02 »
Pois, mas na do ports já é por software penso eu.

EDIT: Sim já confirmei as rotinas todas, não encontrava a sdaOut porque estava inline na classe  ;D
« Última modificação: 08 de Janeiro de 2010, 16:06 por Tyran »

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: I2C por software em C/C++
« Responder #6 em: 08 de Janeiro de 2010, 17:14 »
mas o arm já tem algum hardware para isso certo?

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: I2C por software em C/C++
« Responder #7 em: 08 de Janeiro de 2010, 17:16 »
Tem mas o prof quer implementado por software  :-\

creio que já esteja minimamente funcional, ainda não testei mas deve de estar bom, depois faço debug:
Código: [Seleccione]
#define SDA 2
#define SCL 3

//TODO rever tempos
#define I2C_SETUP_TIME 1
#define I2C_PULSE_TIME 1
#define I2C_HOLD_TIME  1


#include "types.h"
#include "io.h"

#define _SCL(val) (digitalWrite(SCL, val))
#define _SDA(val) (digitalWrite(SDA, val))
#define _SDA_IN (digitalRead(SDA))

void i2c_init()
{
pinMode(SDA, OUTPUT);
pinMode(SCL, OUTPUT);
_SDA(HIGH);
_SCL(HIGH);
}

void i2c_start_seq()
{
_SDA(HIGH);
_SCL(HIGH);
_SDA(LOW);
_SCL(LOW);
_SDA(HIGH);
_SCL(HIGH);
}

void i2c_stop_seq()
{
_SCL(LOW);
_SDA(LOW);
_SCL(HIGH);
_SDA(HIGH);
}

void i2c_begin_transmission(int addr)
{
i2c_start_seq();
i2c_send(addr);
//shiftOut(SDA, SCL, MSBFIRST, addr);
//scl(HIGH);
}

void i2c_end_transmission()
{
i2c_stop_seq();
}

void i2c_send(int byte)
{
_SCL(LOW);
int mask = 0x80;
for (; mask != 0; mask >>= 1) {
_SDA(data & mask);
_SCL(HIGH);
_SCL(LOW);
}
_SDA(HIGH);
_SCL(HIGH);
int ack = ! _SDA_IN();
_SCL(LOW);
return ack;
}

//TODO confirm with datasheet
int i2c_read(){
int data = 0;
int mask = 0x80;
for (; mask != 0; mask >>= 1) {
_SCL(HIGH);
if (_SDA_IN())
    data |= mask;
_SCL(LOW);
}
_SCL(HIGH);
_SCL(LOW);
_SDA(HIGH);
return data;
}


Offline Raul

  • Mini Robot
  • *
  • Mensagens: 185
Re: I2C por software em C/C++
« Responder #8 em: 08 de Janeiro de 2010, 19:49 »
Estás a fazer um braço robotico?
Não sei ao certo o que queres dizer com ARM
Cumprimentos

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: I2C por software em C/C++
« Responder #9 em: 08 de Janeiro de 2010, 19:53 »
http://www.arm.com/

É uma familia de microcontroladores tal como a AVR, Microchip, NXP, etc..

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.598
    • Tróniquices
Re: I2C por software em C/C++
« Responder #10 em: 08 de Janeiro de 2010, 20:43 »
É melhor colocares uns delays para garantires uma frequência máxima de execução... a não ser que o teu chip sejam bem lentinho.

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: I2C por software em C/C++
« Responder #11 em: 08 de Janeiro de 2010, 21:05 »
Tinha me esquecido, está a 60Mhz, é melhor! Obrigado ;)

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: I2C por software em C/C++
« Responder #12 em: 08 de Janeiro de 2010, 21:55 »
É melhor colocares uns delays para garantires uma frequência máxima de execução... a não ser que o teu chip sejam bem lentinho.

Isto é para quando por exemplo faço:
Código: [Seleccione]
for(xpto<100){
   void i2c_send(blabla);
}

ele não enviar os bytes a uma maior frequência do que devia, certo?

Não seria melhor utilizar um timer com esse tempo que vais colocar nos delays e quando este gerar a interrupção alteras uma variável para saber se já foi enviado o byte ou não e se já podes enviar novamente.

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: I2C por software em C/C++
« Responder #13 em: 08 de Janeiro de 2010, 22:09 »
É mais entre transições de sinais para garantir o bitrate i2c compatível.

Isto é só para nos fazer sentir o protocolo todo que depois fazemos por hardware e não é preciso preocupar com nada.

StarRider

  • Visitante
Re: I2C por software em C/C++
« Responder #14 em: 09 de Janeiro de 2010, 21:43 »
Tem mas o prof quer implementado por software  :-\

creio que já esteja minimamente funcional, ainda não testei mas deve de estar bom, depois faço debug:
Código: [Seleccione]
#define SDA 2
#define SCL 3

//TODO rever tempos
#define I2C_SETUP_TIME 1
#define I2C_PULSE_TIME 1
#define I2C_HOLD_TIME  1


#include "types.h"
#include "io.h"

#define _SCL(val) (digitalWrite(SCL, val))
#define _SDA(val) (digitalWrite(SDA, val))
#define _SDA_IN (digitalRead(SDA))

void i2c_init()
{
pinMode(SDA, OUTPUT);
pinMode(SCL, OUTPUT);
_SDA(HIGH);
_SCL(HIGH);
}

void i2c_start_seq()
{
_SDA(HIGH);
_SCL(HIGH);
_SDA(LOW);
_SCL(LOW);
_SDA(HIGH);
_SCL(HIGH);
}

void i2c_stop_seq()
{
_SCL(LOW);
_SDA(LOW);
_SCL(HIGH);
_SDA(HIGH);
}

void i2c_begin_transmission(int addr)
{
i2c_start_seq();
i2c_send(addr);
//shiftOut(SDA, SCL, MSBFIRST, addr);
//scl(HIGH);
}

void i2c_end_transmission()
{
i2c_stop_seq();
}

void i2c_send(int byte)
{
_SCL(LOW);
int mask = 0x80;
for (; mask != 0; mask >>= 1) {
_SDA(data & mask);
_SCL(HIGH);
_SCL(LOW);
}
_SDA(HIGH);
_SCL(HIGH);
int ack = ! _SDA_IN();
_SCL(LOW);
return ack;
}

//TODO confirm with datasheet
int i2c_read(){
int data = 0;
int mask = 0x80;
for (; mask != 0; mask >>= 1) {
_SCL(HIGH);
if (_SDA_IN())
    data |= mask;
_SCL(LOW);
}
_SCL(HIGH);
_SCL(LOW);
_SDA(HIGH);
return data;
}


Boas,

Não percebi bem, esse código é ser executado num ARM ? Com que compilador ?