我的OMAP 3530 的芯片 使用 TPS65930作为电源管理芯片。
我现在需要使用TPS65930的AD功能。
但是在我编程的时候遇到一个问题:
我在使用 SW1 请求开始进行通道2进行AD转换后
CTRL_SW1的 CTRL_SW1[0] BUSY始终为1 、CTRL_SW1[1] EOC_SW1始终为0。GPCH2_LSB和GPCH2_HSB 始终为0.
并且如果不断电重启芯片,上数值无法改变。
请问这个可能是在什么问题上出错。
谢谢。
我的代码如下
void adcTest(void)
{
u8 valBuf;
u8 reg;
u8 readBuf;
// 1.关闭中断模式 MADC_IMR1 的 SW1_IMR1 被置为 0 则开启中断 这里不开启
valBuf = 0xff;
reg = MADC_IMR1;
twl_i2c_write_u8(TWL4030_MODULE_MADC, valBuf, reg);
// 2.设置 CTRL1[0], MACDON 为1
// MADC software power on. When set to 1, MADC is powered.
valBuf = 0X01;
reg = CTRL1;
twl_i2c_write_u8(TWL4030_MODULE_MADC, valBuf, reg);
// 3.设置 SW1SELECT_LSB 和 SW1SELECT_HSB 的相应位为1来选择相应的通道。
valBuf = (0X01 << 2);
reg = SW1SELECT_LSB;
twl_i2c_write_u8(TWL4030_MODULE_MADC, valBuf, reg);
valBuf = 0X0;
reg = SW1SELECT_MSB;
twl_i2c_write_u8(TWL4030_MODULE_MADC, valBuf, reg);
// 4.如果需要取平均值,还可以通过设置 SW1AVERAGE_LSB 和 SW1AVERAGE_HSB 来实现。
valBuf = 0X0;
reg = SW1AVERAGE_LSB;
twl_i2c_write_u8(TWL4030_MODULE_MADC, valBuf, reg);
valBuf = 0X0;
reg = SW1AVERAGE_MSB;
twl_i2c_write_u8(TWL4030_MODULE_MADC, valBuf, reg);
// 5.设置 CTRL_SW1[5] SW1 为 1来开始转换。
valBuf = (0X1 << 5);
reg = CTRL_SW1;
twl_i2c_write_u8(TWL4030_MODULE_MADC, valBuf, reg);
// 6.在MADC转换时 CTRL_SW1 的 EOC_SW1 被置为 0.
mdelay(1000);
readBuf = 0x00;
reg = CTRL_SW1;
twl_i2c_read_u8(TWL4030_MODULE_MADC, &readBuf, reg);
printk(KERN_ERR "CTRL_SW1 = 0x%x\r\n", readBuf);
// 7.当转换完成后 CTRL_SW1 的 EOC_SW1 被置为 1.此时可以读取 GPCHx_LSB 和 GPCHx_MSB
reg = GPCH2_LSB;
twl_i2c_read_u8(TWL4030_MODULE_MADC, &readBuf, reg);
printk(KERN_ERR "GPCH2_LSB = 0x%x\r\n", readBuf);
reg = GPCH2_MSB;
twl_i2c_read_u8(TWL4030_MODULE_MADC, &readBuf, reg);
printk(KERN_ERR "GPCH2_MSB = 0x%x\r\n", readBuf);
}