카테고리 없음

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