⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dm642_saa7121.c

📁 saa7121的显示驱动程序
💻 C
字号:
#include "dm642_saa7121.h"
#include "dm642.h"     


static const I2C_Config saa7121_write_config = {
	0,	//I2CCOAR; master mode;
	0,	//I2CCIMR; no interrupt;
	(20 - 5),	//I2CCLKL; scl low time;
	(20 - 5),	//I2CCLKH; scl high time;
	1,	//I2CCNT; configure later;
	0,	//I2CSAR; configure later;
	0x4620,	//I2CMDR; master tx mode, i2c runs free, 8-bit data + NACK, no repeat mode;
	(75 - 1),	//I2CPSC; 4MHz clock; 
};


static const I2C_Config saa7121_read_config = {
	0,
	0,
	(20 - 5),
	(20 - 5),
	1,
	0,
	0x4420,
	(75 - 1),
};
	

void dm642_saa7121_write(Uint8 dev_addr, Uint32 sub_addr, Uint8 *data, Uint16 num)
{             
	Uint32 i;
	I2C_Config prev_config; 

    
	while (I2C_bb(DM642_I2C_hI2C));
	I2C_getConfig(DM642_I2C_hI2C, &prev_config);	//save old setting
//	I2C_reset(DM642_I2C_hI2C);
	
	I2C_RSETH(DM642_I2C_hI2C, I2CMDR, saa7121_write_config.i2cmdr);	//set i2c register
	I2C_RSETH(DM642_I2C_hI2C, I2CIMR, saa7121_write_config.i2cimr);
	I2C_RSETH(DM642_I2C_hI2C, I2CSAR, dev_addr);
	I2C_RSETH(DM642_I2C_hI2C, I2CCNT, num + 1);
	I2C_RSETH(DM642_I2C_hI2C, I2CDXR, sub_addr);
    
	I2C_start(DM642_I2C_hI2C);	//start
    dm642_wait(1000);
	for(i = 0; i < num; i ++)
	{
		while(!I2C_xrdy(DM642_I2C_hI2C));
		I2C_writeByte(DM642_I2C_hI2C, *data ++);
		dm642_wait(1000);
	}

	I2C_sendStop(DM642_I2C_hI2C); 
    dm642_wait(1000);        
	while (I2C_bb(DM642_I2C_hI2C));
	dm642_wait(1000);        
    
	I2C_config(DM642_I2C_hI2C, &prev_config);	//restore the previou setting
	dm642_wait(10000);        
}     


void dm642_saa7121_read(Uint8 dev_addr, Uint32 sub_addr, Uint8 *data, Uint16 num)
{
	Uint32 i;
	I2C_Config prev_config; 
   
	
	while (I2C_bb(DM642_I2C_hI2C));
	I2C_getConfig(DM642_I2C_hI2C, &prev_config);	//save old setting

	
	I2C_RSETH(DM642_I2C_hI2C, I2CMDR, saa7121_write_config.i2cmdr);	//set write mode;
	I2C_RSETH(DM642_I2C_hI2C, I2CIMR, saa7121_write_config.i2cimr);
	I2C_RSETH(DM642_I2C_hI2C, I2CSAR, dev_addr);
	I2C_RSETH(DM642_I2C_hI2C, I2CCNT, saa7121_write_config.i2ccnt);
	I2C_RSETH(DM642_I2C_hI2C, I2CDXR, sub_addr);
    
	I2C_start(DM642_I2C_hI2C);	//start;
    while(!I2C_xrdy(DM642_I2C_hI2C));		
	I2C_sendStop(DM642_I2C_hI2C); 
    dm642_waitusec(512);	//need a longer delay for write-read conversation;
    	
    I2C_RSETH(DM642_I2C_hI2C, I2CMDR, saa7121_read_config.i2cmdr);	//set read mode;

	I2C_start(DM642_I2C_hI2C);
	while(!I2C_rrdy(DM642_I2C_hI2C));
	
	for(i = 0; i < num; i++)
	{
		*(data + i) = I2C_readByte(DM642_I2C_hI2C);	
	}
	
	I2C_sendStop(DM642_I2C_hI2C);	
	dm642_wait(1000);      
    
	I2C_config(DM642_I2C_hI2C, &prev_config);
	dm642_wait(1000);
}  
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -