I 2 Cバス駆動コード
2247 ワード
前編のI 2 Cバスの紹介を通して、その面では、次にソフトウェア部分のI 2 Cバスに対するプログラミング実装が必要である.
具体的には、(前提は、2つのIOポートがそれぞれSDA SCLであること)
1.1st function: I2c start
3. 3rd:ACK
4. 4th :send one byte
5. 5th: receive one byte
この6つの関数を構築した後、I 2 Cドライバが通信できない理由は何ですか?
もちろん、大神たちにはそれぞれ方法があるかもしれません.弟もここはレンガを投げて玉を引くだけ...
具体的には、(前提は、2つのIOポートがそれぞれSDA SCLであること)
1.1st function: I2c start
void IIC_Start(void)
{
SDA_OUTPUT();
SET_SDA();
usleep(4);
SET_SCL();
usleep(6);
CLR_SDA();
usleep(4);
}
2. 2nd :I2c stop void IIC_Stop (void)
{
usleep(4);
CLR_SCL();
usleep(4);
SDA_OUTPUT();
usleep(4);
CLR_SDA();
usleep(4);
SET_SCL();
usleep(4);
SET_SDA();
usleep(4);
}
3. 3rd:ACK
void I2C_ACK(uint8_t ack)
{
CLR_SCL();
SDA_OUTPUT();
usleep(2);
if (ack)
{
SET_SDA();
}
else
{
CLR_SDA();
}
usleep(2);
SET_SCL();
usleep(4);
CLR_SCL();
usleep(4);
}
4. 4th :send one byte
void IIC_Byte_send (unsigned char data)
{
int j;
for ( j = 0; j < 8; j++ )
{
usleep(4);
CLR_SCL();
usleep(2);
if ( data & 0x80 ) SET_SDA();
else CLR_SDA();
data <<= 1;
usleep(2);
SET_SCL();
}
usleep(4);
}
5. 5th: receive one byte
void IIC_Byte_receive (unsigned char *data)
{
int j;
unsigned char tmp=0x00;
CLR_SCL();
for( j = 0 ; j < 0x08 ; j++)
{
tmp <<=1;
usleep(4);
SET_SCL();
usleep(2);
if (TST_SDA()) tmp += 1;
usleep(2);
CLR_SCL();
}
usleep(4);
*data = tmp;
}
6. 6th:send byte and wait ACK int I2C_Send_data_Wait_ack(unsigned char data)
{
IIC_Byte_send(data); //IIC send one byte
CLR_SCL(); // high clock cycle
SDA_INPUT();
usleep(4);
SET_SCL();
usleep(4);
if (0x00 == TST_SDA() ) //ACK
{
usleep(4);
CLR_SCL();
usleep(4);
SDA_OUTPUT();
SET_SDA();
usleep(4);
}
else
{
IIC_Stop();//NoACK
SET_SCL();
return(0);
}
return(1);
}
この6つの関数を構築した後、I 2 Cドライバが通信できない理由は何ですか?
もちろん、大神たちにはそれぞれ方法があるかもしれません.弟もここはレンガを投げて玉を引くだけ...