私はATTINY85用の非常に単純なI2Cビットバンギングライブラリーを持っています。I2Cセンサーの値を読み取る(ビットバンギング)
#define PORT_SDA PB0
#define PORT_SCL PB2
#define SIGNAL_HIGH(PORT) PORTB |= (1 << PORT)
#define SIGNAL_LOW(PORT) PORTB &= ~(1 << PORT)
void LED_ON(void);
void LED_OFF(void);
void i2c_init(void);
void i2c_start(void);
void i2c_read(void);
void i2c_stop(void);
void i2c_write(uint8_t byte);
void i2c_init()
{
DDRB |= (1 << PORT_SDA);
DDRB |= (1 << PORT_SCL);
}
void LED_ON(void)
{
PORTB |= 0b00000010;
}
void LED_OFF(void)
{
PORTB &= 0b111111101;
}
void i2c_start(void)
{
SIGNAL_HIGH(PORT_SCL);
SIGNAL_HIGH(PORT_SDA);
SIGNAL_LOW( PORT_SDA);
SIGNAL_LOW( PORT_SCL);
}
void i2c_stop(void)
{
SIGNAL_LOW( PORT_SCL);
SIGNAL_LOW( PORT_SDA);
SIGNAL_HIGH(PORT_SCL);
SIGNAL_HIGH(PORT_SDA);
}
void i2c_write(uint8_t byte)
{
uint8_t bit;
for (bit = 0; bit < 0x08; bit++)
{
if((byte << bit) & 0x80)
SIGNAL_HIGH(PORT_SDA);
else
SIGNAL_LOW(PORT_SDA);
SIGNAL_HIGH(PORT_SCL);
SIGNAL_LOW(PORT_SCL);
}
SIGNAL_HIGH(PORT_SDA);
SIGNAL_HIGH(PORT_SCL);
SIGNAL_LOW(PORT_SCL);
}
私は正常にI2Cに問題なく書き込みできます。私はSSD1306とLC2404Bでこのコードをテストしました.VCCが4.2Vに設定されていれば、タイミングも非常に優れています。
i2c_init();
i2c_start();
i2c_write(0xA0);
i2c_write(0x01);
i2c_write(0x13);
i2c_stop();
足すには完璧に動作している間、私は私が後で読むことができる値を返すためにATTINY85と私のI2Cモジュールのいずれかを誘発することができるように見えることはできません。
ラズベリーとGY-521センサーを接続しました(内部アドレスが設定されていなくても値を返すので)。私は、センサデータの変化を見ることができます
:これは、オシロスコープで出力され
i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
i2cget -y 1 0x68
0x02
:私は、センサーを検出し、ラズベリーと次のようにそれから値を読み取ることができます。問題は、私はATTINY85からの同じ要求をセンサーに複製するように見えないということです。センサーは単に値で応答しません。 最初のバイトの最後のビットがACKまたは 'READ'インジケータビットであるかどうかわからないので、別のアドレスを試しました。
i2c_start();
i2c_write( 0b11010001); // address: 0xD1
i2c_start();
i2c_write( 0b11010000); // address: 0xD0
i2c_start();
i2c_write( 0b10100001); // address: 0xA1
i2c_start();
i2c_write( 0b10100000); // address: 0xA0
関係なく、私が使用しているもののアドレスに、センサーは単純に(oscioloscopeで)応答しないと、私はアドレスバイトを送信した後、SDAラインが高いまま。私は住所を送った後に別のstart()条件を追加しようとしましたが、運がまだありません。私が間違っているところのヒント?センサーをATTINY85読み取り要求に応答させたいので、後で値を読み取ることができます。ありがとう!
"スレーブがデータを出力するためのクロックも供給する必要があります。それだった!どうもありがとうございました! – Kristian