本帖最后由 我爱下载 于 2018-2-2 08:12 编辑
通过研究手册,了解到max14001的配置过程如下图所示
这个是官方手册中推荐的配置流程。按照配置流程实现的代码如下:
max14001通讯数据形成
uint16_t max14001_tdata_get(uint16_t data, uint8_t rw, uint8_t addr)
{
uint16_t tdata;
if(rw == 1) //write
tdata = (data & 0x3ff) | (1<<10) | (addr << 11);
else
tdata = (data & 0x3ff) | (0<<10) | (addr << 11);
return tdata;
}
寄存器读写配置函数
uint16_t max14001_readreg(uint8_t addr)
{
uint16_t tdata,rdata;
tdata = max14001_tdata_get(0x0000, 0, addr);
LPSPI1_transmit_16bits(tdata); /* Transmit half word (16 bits) on LPSPI1 */
LPSPI1_receive_16bits(); /* Receive half word on LSPI1 */
LPSPI1_transmit_16bits(tdata); /* Transmit half word (16 bits) on LPSPI1 */
rdata = LPSPI1_receive_16bits() & 0x03FF; /* Receive half word on LSPI1 */
return rdata;
}
void max14001_writereg(uint16_t data, uint8_t addr)
{
uint16_t tdata;
tdata = max14001_tdata_get(data, 1, addr);
LPSPI1_transmit_16bits(tdata); /* Transmit half word (16 bits) on LPSPI1 */
LPSPI1_receive_16bits(); /* Receive half word on LSPI1 */
}
按照配置流程要求完成的初始化函数。
uint8_t max14001_init(void)
{
uint16_t tdata,rdata;
uint8_t ret = 1;
char str;
max14001_reset();
LPUART1_transmit_string("init max14001 \n\r"); /* Transmit char string */
//Read flags 0x100
rdata = max14001_readreg(0x02);
rdata &= 0x1ff;
sprintf(str,"flags=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
// if(rdata == 0x0100) //no errors
{
//write wen=0x294
max14001_writereg(0x294, 0x0C);
//clear flten, mv
rdata = max14001_readreg(0x03);
rdata &= 0x1FF;
// sprintf(str,"flten=%x\n\r",rdata);
// LPUART1_transmit_string(str); /* Transmit char string */
rdata &= ~0x0100; //clr emv
max14001_writereg(rdata, 0x03);
//some config
//write thl = 0x001
max14001_writereg(0x0001, 0x04);
//write thu = 0x200
max14001_writereg(0x0200, 0x05);
//write inrr = 0x0c0
max14001_writereg(0x00c0, 0x06);
//write inrt = 0x180
max14001_writereg(0x0180, 0x07);
//write inrp = 0x1d8
max14001_writereg(0x01d8, 0x08);
//write cfg = 0x183
max14001_writereg(0x01AF, 0x09);
//write act = 0x00
max14001_writereg(0x0000, 0x0B);
//write enbl = 0
max14001_writereg(0x0000, 0x0A);
//config verification
//write thlv = 0x001
max14001_writereg(0x0001, 0x14);
//write thuv = 0x200
max14001_writereg(0x0200, 0x15);
//write inrrv = 0x0c0
max14001_writereg(0x00c0, 0x16);
//write inrtv = 0x180
max14001_writereg(0x0180, 0x17);
//write inrpv = 0x1d8
max14001_writereg(0x01d8, 0x18);
//write cfgv = 0x183
max14001_writereg(0x01AF, 0x19);
//write enblv = 0
max14001_writereg(0x0000, 0x1A);
//write ftlen and fltev
max14001_writereg(0x0000, 0x03);
max14001_writereg(0x0000, 0x13);
//write wen=0x000
max14001_writereg(0x000, 0x0C);
//read config reg
rdata = max14001_readreg(0x03);
sprintf(str,"flten=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x04);
sprintf(str,"thl=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x05);
sprintf(str,"thu=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x06);
sprintf(str,"inrr=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x07);
sprintf(str,"inrt=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x08);
sprintf(str,"inrp=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x09);
sprintf(str,"cfg=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x0A);
sprintf(str,"enbl=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x13);
sprintf(str,"fltev=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x14);
sprintf(str,"thlv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x15);
sprintf(str,"thuv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x16);
sprintf(str,"inrrv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x17);
sprintf(str,"inrtv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x18);
sprintf(str,"inrpv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x19);
sprintf(str,"cfgv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x1A);
sprintf(str,"enblv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
//read flags twice
rdata = max14001_readreg(0x02);
sprintf(str,"flags=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x02);
sprintf(str,"flags=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
// if(rdata == 0) //no error
{
//write wen=0x294
max14001_writereg(0x294, 0x0C);
//write enbl = 0x0010
max14001_writereg(0x0010, 0x0A);
//write enblv = 0x0010
max14001_writereg(0x0010, 0x1A);
rdata = max14001_readreg(0x02);
sprintf(str,"flags=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x02);
sprintf(str,"flags=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
// if(rdata == 0) //no error
{
//write wen=0x000
max14001_writereg(0x000, 0x0C);
ret = 0;
}
// else //some error
{
}
}
// else //some error
{
}
}
// else //some errors
{
}
return ret;
}
这里总结几个问题:
1、按照手册中的说明,上电后读取FLAGS寄存器时,应该返回默认值0x100,但是实际上返回0x180,不知道原因出在哪里。
2、配置过程中,多次读取FLAGS寄存器,返回值与说明不符,不是返回0x000,而是0x080或0x090
本帖最后由 我爱下载 于 2018-2-2 08:12 编辑
通过研究手册,了解到max14001的配置过程如下图所示
这个是官方手册中推荐的配置流程。按照配置流程实现的代码如下:
max14001通讯数据形成
uint16_t max14001_tdata_get(uint16_t data, uint8_t rw, uint8_t addr)
{
uint16_t tdata;
if(rw == 1) //write
tdata = (data & 0x3ff) | (1<<10) | (addr << 11);
else
tdata = (data & 0x3ff) | (0<<10) | (addr << 11);
return tdata;
}
寄存器读写配置函数
uint16_t max14001_readreg(uint8_t addr)
{
uint16_t tdata,rdata;
tdata = max14001_tdata_get(0x0000, 0, addr);
LPSPI1_transmit_16bits(tdata); /* Transmit half word (16 bits) on LPSPI1 */
LPSPI1_receive_16bits(); /* Receive half word on LSPI1 */
LPSPI1_transmit_16bits(tdata); /* Transmit half word (16 bits) on LPSPI1 */
rdata = LPSPI1_receive_16bits() & 0x03FF; /* Receive half word on LSPI1 */
return rdata;
}
void max14001_writereg(uint16_t data, uint8_t addr)
{
uint16_t tdata;
tdata = max14001_tdata_get(data, 1, addr);
LPSPI1_transmit_16bits(tdata); /* Transmit half word (16 bits) on LPSPI1 */
LPSPI1_receive_16bits(); /* Receive half word on LSPI1 */
}
按照配置流程要求完成的初始化函数。
uint8_t max14001_init(void)
{
uint16_t tdata,rdata;
uint8_t ret = 1;
char str;
max14001_reset();
LPUART1_transmit_string("init max14001 \n\r"); /* Transmit char string */
//Read flags 0x100
rdata = max14001_readreg(0x02);
rdata &= 0x1ff;
sprintf(str,"flags=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
// if(rdata == 0x0100) //no errors
{
//write wen=0x294
max14001_writereg(0x294, 0x0C);
//clear flten, mv
rdata = max14001_readreg(0x03);
rdata &= 0x1FF;
// sprintf(str,"flten=%x\n\r",rdata);
// LPUART1_transmit_string(str); /* Transmit char string */
rdata &= ~0x0100; //clr emv
max14001_writereg(rdata, 0x03);
//some config
//write thl = 0x001
max14001_writereg(0x0001, 0x04);
//write thu = 0x200
max14001_writereg(0x0200, 0x05);
//write inrr = 0x0c0
max14001_writereg(0x00c0, 0x06);
//write inrt = 0x180
max14001_writereg(0x0180, 0x07);
//write inrp = 0x1d8
max14001_writereg(0x01d8, 0x08);
//write cfg = 0x183
max14001_writereg(0x01AF, 0x09);
//write act = 0x00
max14001_writereg(0x0000, 0x0B);
//write enbl = 0
max14001_writereg(0x0000, 0x0A);
//config verification
//write thlv = 0x001
max14001_writereg(0x0001, 0x14);
//write thuv = 0x200
max14001_writereg(0x0200, 0x15);
//write inrrv = 0x0c0
max14001_writereg(0x00c0, 0x16);
//write inrtv = 0x180
max14001_writereg(0x0180, 0x17);
//write inrpv = 0x1d8
max14001_writereg(0x01d8, 0x18);
//write cfgv = 0x183
max14001_writereg(0x01AF, 0x19);
//write enblv = 0
max14001_writereg(0x0000, 0x1A);
//write ftlen and fltev
max14001_writereg(0x0000, 0x03);
max14001_writereg(0x0000, 0x13);
//write wen=0x000
max14001_writereg(0x000, 0x0C);
//read config reg
rdata = max14001_readreg(0x03);
sprintf(str,"flten=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x04);
sprintf(str,"thl=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x05);
sprintf(str,"thu=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x06);
sprintf(str,"inrr=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x07);
sprintf(str,"inrt=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x08);
sprintf(str,"inrp=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x09);
sprintf(str,"cfg=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x0A);
sprintf(str,"enbl=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x13);
sprintf(str,"fltev=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x14);
sprintf(str,"thlv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x15);
sprintf(str,"thuv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x16);
sprintf(str,"inrrv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x17);
sprintf(str,"inrtv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x18);
sprintf(str,"inrpv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x19);
sprintf(str,"cfgv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x1A);
sprintf(str,"enblv=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
//read flags twice
rdata = max14001_readreg(0x02);
sprintf(str,"flags=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x02);
sprintf(str,"flags=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
// if(rdata == 0) //no error
{
//write wen=0x294
max14001_writereg(0x294, 0x0C);
//write enbl = 0x0010
max14001_writereg(0x0010, 0x0A);
//write enblv = 0x0010
max14001_writereg(0x0010, 0x1A);
rdata = max14001_readreg(0x02);
sprintf(str,"flags=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
rdata = max14001_readreg(0x02);
sprintf(str,"flags=%x\n\r",rdata);
LPUART1_transmit_string(str); /* Transmit char string */
// if(rdata == 0) //no error
{
//write wen=0x000
max14001_writereg(0x000, 0x0C);
ret = 0;
}
// else //some error
{
}
}
// else //some error
{
}
}
// else //some errors
{
}
return ret;
}
这里总结几个问题:
1、按照手册中的说明,上电后读取FLAGS寄存器时,应该返回默认值0x100,但是实际上返回0x180,不知道原因出在哪里。
2、配置过程中,多次读取FLAGS寄存器,返回值与说明不符,不是返回0x000,而是0x080或0x090