카테고리 없음
i2c 소프트웨어 검증 디버깅 출력
안녕1999
2020. 1. 2. 22:47
장비가 아직 안만들어진 상태라서, i2c코드가 잘 동작하는지 확인하기 위해,
텍스트 모드로 출력하여 파형을 확인.
데이터시트의 파형과 비슷한듯.
오실로스코프 없이 PC프로그램상에서 코드 검증.
SDA=-___ ---------_______________ -_________---____________--- -___ ___-
SCL=---_ _-__-__-__-__-__-__-__-_ __-__-__-__-__-__-__-__-__-_ __-_ __--
SDA=-___ ---------_______________ -___---__________________--- -___ ___-
SCL=---_ _-__-__-__-__-__-__-__-_ __-__-__-__-__-__-__-__-__-_ __-_ __--
sI2C_BUF win32_sI2C_BUF;char off_on_char[]={'_','-'};
void win32_i2c_SCL_SDA_update()
{
win32_sI2C_BUF.buf_scl[win32_sI2C_BUF.i]=off_on_char[win32_sI2C_BUF.scl];
win32_sI2C_BUF.buf_sda[win32_sI2C_BUF.i]=off_on_char[win32_sI2C_BUF.sda];
}
void win32_sI2C_BUF_add_space()
{
win32_sI2C_BUF.buf_scl[win32_sI2C_BUF.i]=' ';
win32_sI2C_BUF.buf_sda[win32_sI2C_BUF.i]=' ';
win32_sI2C_BUF.i++;
win32_sI2C_BUF.buf_scl[win32_sI2C_BUF.i]=' ';
win32_sI2C_BUF.buf_sda[win32_sI2C_BUF.i]=' ';
win32_sI2C_BUF.i++;
win32_i2c_SCL_SDA_update();
I2C_delay();
}
void win32_sI2C_BUF_add_new_line()
{
win32_sI2C_BUF.buf_scl[win32_sI2C_BUF.i]='\r';
win32_sI2C_BUF.buf_sda[win32_sI2C_BUF.i]='\r';
win32_sI2C_BUF.i++;
win32_sI2C_BUF.buf_scl[win32_sI2C_BUF.i]='\n';
win32_sI2C_BUF.buf_sda[win32_sI2C_BUF.i]='\n';
win32_sI2C_BUF.i++;
win32_i2c_SCL_SDA_update();
I2C_delay();
}
void win32_sI2C_BUF_print_and_reset()
{
static int sleep_cnt;
int scl,sda;
//DEBUG_printf(("SDA=%s\r\nSCL=%s",win32_sI2C_BUF.buf_sda,win32_sI2C_BUF.buf_scl));
DEBUG_printf(("SCL=%s\r\nSDA=%s",win32_sI2C_BUF.buf_scl,win32_sI2C_BUF.buf_sda));
_UART_puts_rn(win32_sI2C_BUF.buf_scl);
_UART_puts_rn(win32_sI2C_BUF.buf_sda);
scl=win32_sI2C_BUF.scl;
sda=win32_sI2C_BUF.sda;
memset(&win32_sI2C_BUF,0,sizeof(win32_sI2C_BUF));
win32_sI2C_BUF.scl=scl;
win32_sI2C_BUF.sda=sda;
win32_i2c_SCL_SDA_update();
win32_sI2C_BUF.i=1;
sleep_cnt++;
if(sleep_cnt>=10)
{
sleep_cnt=0;
Sleep(10);
}
}
void win32_i2c_SCL_H()
{
win32_sI2C_BUF.scl=1;
win32_i2c_SCL_SDA_update();
}
void win32_i2c_SCL_L()
{
win32_sI2C_BUF.scl=0;
win32_i2c_SCL_SDA_update();
}
void win32_i2c_SDA_H()
{
win32_sI2C_BUF.sda=1;
win32_i2c_SCL_SDA_update();
}
void win32_i2c_SDA_L()
{
win32_sI2C_BUF.sda=0;
win32_i2c_SCL_SDA_update();
}
void win32_i2c_Delay()
{
win32_i2c_SCL_SDA_update();
win32_sI2C_BUF.i++;
}
static byte win32_next_ACK;
void _win32_set_SDA(int a)
{
if(a)
{
win32_i2c_SDA_H();
}
else
{
win32_i2c_SDA_L();
}
}
void _win32_HT16K33_I2C_SDA_get()
{
static int i;
static byte4 d=0x12345678;
int a;
a=gbi(d,31-i);
i++;
if(i>=32)i=0;
_win32_set_SDA(a);
}
#else
#define win32_sI2C_BUF_print_and_reset()
#define win32_i2c_SCL_H()
#define win32_i2c_SCL_L()
#define win32_i2c_SDA_H()
#define win32_i2c_SDA_L()
#define win32_i2c_Delay()
#define win32_sI2C_BUF_add_space()
#define _win32_set_SDA(a)
#define _win32_HT16K33_I2C_SDA_get()
#endif
#define SCL_H() psI2C->SCL_H();win32_i2c_SCL_H();
#define SCL_L() psI2C->SCL_L();win32_i2c_SCL_L();
#define SDA_H() psI2C->SDA_H();win32_i2c_SDA_H();
#define SDA_L() psI2C->SDA_L();win32_i2c_SDA_L();
void sI2C_init(sI2C *psI2C)
{
//DEBUG_UART_puts_rn("sI2C_init()");
psI2C->SCL_set_OUT();
psI2C->SDA_set_OUT();
SCL_H();
SDA_H();
I2C_delay();
}
void sI2C_START(sI2C *psI2C)
{
//DEBUG_UART_puts_rn("sI2C_START()");
win32_sI2C_BUF_print_and_reset();
sI2C_init(psI2C);
SDA_L();
I2C_delay();
SCL_L();
I2C_delay();
//win32_sI2C_BUF_add_space();
win32_sI2C_BUF_print_and_reset();
}
void sI2C_STOP(sI2C *psI2C)
{
//DEBUG_UART_puts_rn("sI2C_STOP()");
//win32_sI2C_BUF_add_space();
SDA_L();
I2C_delay();
SCL_H();
I2C_delay();
SDA_H();
I2C_delay();
win32_sI2C_BUF_print_and_reset();
}
sI2C.zip
0.00MB