IIC 샘플 코드
#포함 “IIC.h”
//————-지연 시간_us——————————-
무효 지연(u16t)
{
동안 (티 != 0)
티–;
}
/*무효 IIC_시작(무효의) */
{
SDA = 1;
SCL = 1;
지연(지연 시간);
SDA = 0;
지연(지연 시간);
SCL = 0;
}
/* 무효 IIC_Stop(무효의) */
{
SCL = 0;
SDA = 0;
지연(지연 시간);
SCL = 1;
지연(지연 시간);
SDA = 1;
}
/*
서명되지 않은 문자 IIC_Wait_Ack(무효의) */
{
u8 녹화 = 0;
지연(지연 시간); //
SDA = 1; //
SCL = 1;
지연(지연 시간);
기록 = SDA;
SCL = 0; //
지연(지연 시간);
Rec 반환;
}
/* IIC_Ack 무효(무효의) */
{
SCL = 0;
SDA = 0;
지연(지연 시간);
SCL = 1;
지연(지연 시간);
SCL = 0;
지연(지연 시간);
}
/* 무효 IIC_NAck(무효의) */
{
SCL = 0;
SDA = 1;
지연(지연 시간);
SCL = 1;
지연(지연 시간);
SCL = 0;
지연(지연 시간);
}
/*
IIC_Send_Byte 무효(u8 TXD) */
{
u8 나;
~을 위한(나는 = 0; 나 < 8; 나++)
{
SDA = (TXD & 0x80) >> 7; //
TXD <<= 1;
지연(지연 시간);
SCL = 1;
지연(지연 시간);
SCL = 0;
지연(지연 시간);
}
}
/*
u8 IIC_Read_Byte(무효의)*/
{
u8 나, 기록 = 0;
SDA = 1; //
~을 위한(나는 = 0; 나 < 8; 나++)
{
SCL = 0;
지연(지연 시간);
SCL = 1;
기록 <<= 1;
만약(SDA) 기록 |= 1; //
지연(지연 시간);
}
Rec 반환;
}
#포함 “XGZP6897D.h”
//u8 온도_a5;
//————-데이터 1바이트 쓰기,MASTER에서 SLAVER로의 데이터 ——————————
//————-SLAVER 주소 비트:01101101——————————-
무효 Write_One_Byte(u8 주소, u8 데이터) //쓰다 “자료” SLAVER의 주소로 “주소”
{
IIC_시작(); //IIC 시작
IIC_Send_Byte(0xDA); //IIC 쓰기 작업,SLAVER 주소
IIC_Wait_Ack();
IIC_Send_Byte(주소); /*주소*/
IIC_Wait_Ack();
IIC_Send_Byte(자료); /*자료*/
IIC_Wait_Ack();
IIC_정지(); //IIC 정지
}
//————-1바이트의 데이터 읽기,SLAVER에서 MASTER로의 데이터 —————————-
u8 Read_One_Byte(u8 주소)
{
u8 마이데이터;
IIC_시작();
IIC_Send_Byte(0xDA);
IIC_Wait_Ack();
IIC_Send_Byte(주소);
IIC_Wait_Ack();
IIC_시작();
IIC_Send_Byte(0xDB); //IIC 읽기 작업
IIC_Wait_Ack();
mydata = IIC_Read_Byte();
IIC_Nack(); //
IIC_정지();
내 데이터 반환;
}
//
XGZP_Start_Conversion 무효()
{
Write_One_Byte(0x30, 0x0A); //결합된 전환을 나타내다
동안 ((읽기_원_바이트(0x30) & 0x08) > 0);
}
//————-n바이트의 데이터 쓰기—————————-
u8 소프트웨어_i2c_Write_nByte(u8 슬레이브 주소, u8 REG_주소, u8만, u8 *버프)
{
나는;
//
IIC_시작();
//
IIC_Send_Byte(슬레이브 주소);
IIC_Wait_Ack();
//
IIC_Send_Byte(REG_주소);
IIC_Wait_Ack();
//
~을 위한 (나는 = 0; 나 < 렌; 나++) {
IIC_Send_Byte(버프[나]);
만약 (IIC_Wait_Ack() == 실패) {
IIC_정지();
반품 실패;
}
}
//
IIC_정지();
성공을 반환;
}
//————-n바이트의 데이터 읽기—————————-
u8 소프트웨어_i2c_Read_nByte(u8 슬레이브 주소, u8 REG_주소, u8만, u8 *버프)
{
//
IIC_시작();
//
IIC_Send_Byte(슬레이브 주소);
IIC_Wait_Ack();
//
IIC_Send_Byte(REG_주소);
IIC_Wait_Ack();
//
IIC_시작();
//
IIC_Send_Byte(슬레이브 주소 + 1);
IIC_Wait_Ack();
//
동안 (렌) {
//
*buf = IIC_Read_Byte();
//
만약 (렌 == 1)
IIC_Nack();
//
또 다른
IIC_Ack();
//
버프++;
//
렌–;
}
//
IIC_정지();
성공을 반환;
}
//————-3바이트의 압력 데이터 읽기—————————-
u8 Read_Pressure_ThreeBytes(u8 *압력_H, u8 *압력_M, u8 *압력_L)
{
u8 버퍼[3];
u8 결과;
결과 = Software_i2c_Read_nByte(0xDA, 0x06, 3, 완충기); //
만약(결과 == 성공) {
*압력_H = 버퍼[0]; //
*압력_M = 버퍼[1]; //
*압력_L = 버퍼[2]; //
성공을 반환;
} 또 다른 {
반품 실패;
}
}
무효 메인()
{
센서데이터 *p_sensor_data = &센서_데이터; //
p_sensor_data->압력_k = 8192;
LCD1602_열(); //
LCD1602_show_string(3, 0, “압력”); //
동안(1)
{
Write_One_Byte(0x30, 0x0A); //결합된 전환을 나타내다
// 동안 ((읽기_원_바이트(0x30) & 0x08) > 0);
Delay_ms(10);
//
만약(Read_Pressure_ThreeBytes(&p_sensor_data->압력_H,
&p_sensor_data->압력_M,
&p_sensor_data->압력_L) == 성공)
{
//
p_sensor_data->압력_AD = (부호 없는 긴)((((부호 없는 긴)p_sensor_data->압력_H) << 16) |
(((부호 없는 정수)p_sensor_data->압력_M) << 8) |
((서명되지 않은 문자)p_sensor_data->압력_L));
//
p_sensor_data->압력 = (p_sensor_data->압력_AD > 8388608) ?
(더블)((p_sensor_data->압력_AD – 16777216) / (더블)(p_sensor_data->압력_k)) :
(더블)(p_sensor_data->압력_AD / (더블)(p_sensor_data->압력_k));
//
만약 (is_zero_point_set)
{
zero_point_press = p_sensor_data->압력; //
is_zero_point_set = 0; //
}
p_sensor_data->압력 -= zero_point_press;
//
만약 (p_sensor_data->압력 > 1000.0) {
//
p_sensor_data->압력 /= 1000.0;
float_to_str(p_sensor_data->P_버퍼, p_sensor_data->압력, 2, ” kPa”);
} 또 다른 {
float_to_str(p_sensor_data->P_버퍼, p_sensor_data->압력, 2, ” 아빠”);
}
LCD1602_show_string(3, 1, p_sensor_data->P_버퍼);
}
또 다른
{
//
LCD1602_show_string(3, 1, “읽기 오류”);
}
Delay_ms(200); //
}
}