A, rasgos básicos de la CII
La comunicación de dos hilos: una línea de datos (SDA) y una línea de reloj (SCL).
IIC puede estar vinculado a una pluralidad de dispositivos, los puntos principales de la máquina (acceso Slave huésped). En el dispositivo bus IIC tiene una dirección de dispositivo única, un host correspondiente está determinada por la dirección del dispositivo esclavo.
CII comunicación half-duplex, la resistencia pull-up hardware necesario es generalmente valor típico es 4.7K 4.7K ~ 10K. El límite máximo de la capacitancia del bus de 400pF.
Dos, CII Comunicación Momento
CII es alto cuando está inactivo.
Escribir datos desde el ordenador central para
indicar el inicio y la parada de
señal de inicio: cuando el SCL es alta, la SDA de mayor a menor
señal de parada: cuando el SCL es alta, la SDA de bajo a alto
void I2C_Start(void) //起始信号函数
{
SDA_Out(1); //SDA输出高
SCL_Out(1); //SCL输出高
delay_us(5);
SDA_Out(0); //SDA输出低
delay_us(5);
SCL_Out(0);
delay_us(3);
}
void I2c_Stop(void) //停止信号函数
{
SDA_Out(0); //SDA输出低
SCL_Out(0); //SCL输出低
delay_us(5);
SCL_Out(1); //SCL输出高
delay_us(5);
SDA_Out(1);
delay_us(3);
}
Los datos cambia a un nivel bajo sólo en SCI
****主机发送数据到从机****
sombreadas de datos transmitidos a la máquina host, datos en blanco se devuelve desde la máquina.
[Bits de lectura-escritura dirección de 7 bits de esclavos como una dirección, el bit más bajo se (0: operación de escritura al esclavo; 1: Esclavo leer) Leer +] + alta señal de inicio: primer anfitrión envía ACK (enviado desde el esclavo al maestro ) leer datos de escritura + + ACK + ... + leer datos de escritura + ACK + señal de parada.
Enviar datos al ordenador host es un esclavo de la máquina host desde el ACK.
Recibir datos de un ordenador central para
los datos de transmisión a los datos devueltos desde la máquina de esclavo, el anfitrión está sombreado blanco.
[Bits de lectura-escritura dirección de 7 bits de esclavos como una dirección, el bit más bajo se (0: operación de escritura al esclavo; 1: Esclavo leer) Leer +] + alta señal de inicio: primer anfitrión envía ACK (enviado desde el esclavo al maestro ) leer datos de escritura + + ACK + ... + leer + ACK + señal de parada de escritura de datos.
Resumen ACK: ACK se envía a los datos de dispositivo del dispositivo de transmisión de datos que reciben.
void Ack(void) //主机读ACK
{
SCL_Out(0);
delay_us(2);
SDA_Out(1);
SDA_IN();
delay_us(2);
SCL_Out(1);
SDA_Out(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7));
delay_us(4);
SCL_Out(0);
SDA_OUT();
delay_us(2);
}
void Nack(uint8_t ack) //主机写ACK
{
SCL_Out(0);
delay_us(2);
if(ack == 1)
SDA_Out(1);
else
SDA_Out(0); //写应答信号
delay_us(2);
SCL_Out(1); //拉高时钟线
delay_us(4); //延时
SCL_Out(0); //拉低时钟线
delay_us(2); //延时
}
El maestro envía los datos de función ACK, y la última función es el host recibe un alto datos Nack Nack
void I2c_SendByte(uint8_t _ucByte) //主机发送8bit数据
{
uint8_t i;
for (i = 0; i < 8; i++)
{
if (_ucByte & 0x80)
SDA_Out(1);
else
SDA_Out(0);
delay_us(2);
SCL_Out(1);
delay_us(2);
_ucByte <<= 1; //左移一个bit
SCL_Out(0);
}
SDA_Out(0);
delay_us(1);
SCL_Out(0);
delay_us(1);
}
uint8_t I2c_ReadByte(void) //主机接收8bit数据
{
uint8_t i;
uint8_t value;
/* 读到第1个bit为数据的bit7 */
value = 0;
for (i = 0; i < 8; i++)
{
value<<=1;
SCL_Out(0);
SDA_IN();
delay_us(2);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))
value |= 0x01 ;
else
value &= 0xfe;
SCL_Out(1);
delay_us(2);
}
SCL_Out(0);
SDA_OUT();
delay_us(2);
SDA_Out(0);
delay_us(2);
return value;
}
int I2C_Write(uint8_t addr , uint8_t* buff, uint8_t size) //主机发数据
{
uint8_t i;
I2C_Start();
I2c_SendByte(addr);
Ack();
for(i = 0; i < size; i++)
{
I2c_SendByte(buff[i]);
Ack();
}
I2c_Stop();
return 0;
}
int I2C_Read(uint8_t addr , uint8_t* buff, uint8_t size,uint8_t bus_bit) //主机接收数据
{
uint8_t i,busy;
I2C_Start();
I2c_SendByte(addr+1);
delay_us(2);
Ack();
for(i = 0; i< (size-1); i++)
{
buff[i] = I2c_ReadByte();
delay_us(2);
Nack(0);
}
buff[size-1] = I2c_ReadByte();
delay_us(2);
Nack(1);
delay_us(10);
I2c_Stop();
return 0;
}