cc2640 control lmt70
hello,我在开发用cc2640去采集lmt70芯片的温度时,遇到了这样的问题,在lmt70的供电端上电前就接到cc2640时,程序无法启动。如果将lmt70的供电端先断掉再接上,发现可以正常运行程序,能打印正确采集的温度,能广播。请帮忙给点建议。详情如下(附上原理图和pcb图):
我想要实现的功能是用cc2640的adc来采集lmt70给出的模拟信号,根据datasheet来转换成温度。但是我发现了一个比较怪异的问题:一旦我将lmt70的供电端在上电之前(即原理图和pcb那样),就发现程序无法启动:无法发广播,无法用串口打印出数据,debug模式下程序只能跑到main函数的最后一句BIOS_start();处停止。遇到这种情况,我做了如下的事情来排除一些原因。
1,硬件是否连接好。我用示波器测量lmt70的TAO端,得到950mv左右的电压,转换成温度28度,这个虽然稍有偏差,但是可能是adc采样的误差。还有遇到过如果lmt70没有正常的被供电,那么输出的电压是600mv左右。所以硬件连接应该没问题。
2,确认软件adc的采样功能能够正常运行。将lmt70的供电端先不供电,待程序启动后再供电,发现能够准确采集到数值。adc采样应该也没有问题。
3,确认供电端是否正常工作。将DIO_7引脚连接至led灯,再串一个电阻。发现可以将led灯点亮或熄灭。而且量DIO_7端电压也是3.2v。
4,排除芯片问题。焊接另外一个cc2640芯片,发现结果仍然没有变化。
5,排除串口的原因。程序中将串口的部分的代码注释掉。编译不出错。再烧录之后发现仍然有同样的问题。
6,不用DIO_7供电,直接用vcc3.3v给lmt70供电。这时程序是可以正常的运行,且能打印采集到的正确数据。
7,lmt70部分原理图有参考官方的datasheet。
8,换成别的端口给lmt70供电,比如用DIO_3(飞线),结果仍然有同样的问题。
9,先断开adc端口,只连接DIO_7。仍然有同样的问题。即使程序中将DIO_7输出低电平。
总结下问题现象就是:一旦DIO_7引脚与lmt70的供电端连接上,程序就不能运行起来。
my question is when DIO_7 connect to lmt70's vdd,my program will not start.It stops at BIOS_start().I am wondering why do this cause stop of program? please help me ,thanks very much.
附上部分代码(并不是在同一个文件中,只是一部分相关代码):
//Light_Power 为采集lmt70信号端
PIN_Config BoardGpioInitTable3[] = {
Light_Value | PIN_INPUT_EN | PIN_PULLUP | PIN_HYSTERESIS,
PIN_TERMINATE
};
//Light_Power 为给lmt70供电端
PIN_Config BoardGpioInitTable4[] = {
Light_Power | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_OPENSOURCE | PIN_DRVSTR_MAX, /* optical power initially off */ /* Button is active low */
PIN_TERMINATE
};
void led_key_init(void)
{
// Open pin structure for use
hSbpPins = PIN_open(&sbpPins, BoardGpioInitTable4);
// Register ISR
PIN_registerIntCb(hSbpPins, buttonHwiFxn);
// Configure interrupt
PIN_setConfig(hSbpPins, PIN_BM_IRQ, Board_KEY_SELECT | PIN_IRQ_NEGEDGE);
// Enable wakeup
PIN_setConfig(hSbpPins, PINCC26XX_BM_WAKEUP, Board_KEY_SELECT|PINCC26XX_WAKEUP_NEGEDGE);
//PIN_setOutputValue(hSbpPins, Light_Power , 1);
}
void light_sensor_init(void)
{
hSbpPins = PIN_open(&sbpPins, BoardGpioInitTable3);
// Enable clock for ADC digital and analog interface (not currently enabled in driver)
AUXWUCClockEnable(AUX_WUC_MODCLKEN0_SOC_M|AUX_WUC_MODCLKEN0_AUX_ADI4_M);
// Connect AUX IO4 (DIO1) as analog input. Light sensor on SmartRF06EB
AUXADCSelectInput(ADC_COMPB_IN_AUXIO4);
//AUXADCEnableSync(AUXADC_REF_FIXED, AUXADC_SAMPLE_TIME_10P6_US, AUXADC_TRIGGER_MANUAL);
}
uint16 cal_light(void)
{
uint16 light_value;
AUXADCEnableSync(AUXADC_REF_VDDA_REL, AUXADC_SAMPLE_TIME_2P7_US, AUXADC_TRIGGER_MANUAL);
AUXADCGenManualTrigger();
light_value = (uint16)(AUXADCReadFifo());
AUXADCDisable();
return light_value;
}
uint16 light_evt_handle2(void)
{
uint16 ave_adc_result = 0;
uint16 temp;
uint16 adc_result[10] ;
uint8 i,j;
for(i=0;i<10;i++)
{
adc_result[i]=cal_light();
}
for(i=0;i<10;i++)
{
ave_adc_result=ave_adc_result+adc_result[i];
}
ave_adc_result=ave_adc_result/10;
ave_adc_result=(ave_adc_result*3300)/4096; //转换成0.1mv
return ave_adc_result;
}
PIN_setOutputValue(hSbpPins, Light_Power ,1);
testValue=light_evt_handle2();
dongdong,
好多字啊。。。
长话短说,几乘几的2650?根据你的描述,我猜是4x4的。而且我猜你用的还是SDK2.0?
如果真是这样,那就好解释了。
两个方法你可以尝试:
1. 在你的app工程里,TOOLS->appBLE.cfg 打开,Boot.checkBackdoor 改成fasle。
2. 第二个方法更简单,升级到SDK 2.1。
SDK2.0里面会启动检测backdoor的pin脚, 4x4的刚好是DIO_7。
Y,感谢!感谢!感谢!(重要的事情说三遍!)根据你的提示,我试了一下,完美的解决了我的问题。对我的项目开发有了极大的好处。再次感谢!
Hi,Y。我用的确实是4x4封装。另外请教下怎么更新sdk?
dongdong,
去TI的wiki上就有连接下载:http://processors.wiki.ti.com/index.php/Category:BluetoothLE
YAN 大,如果用这个库函数写AD,单路可以按照楼主那样写,那如果多路怎么办呢?