📄 dm642_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 + -