新建项目,从官方ASF库中选择starter kit demo。
这个例程测试I/O xplained子卡上的温度传感器、光线传感器和TF,并在OLED上显示出来。因此它需要使用到OLED和I/O xplained两个子卡。它们分别接在EXT2和EXT3扩展口上,不能接错了。
选择好模板,以及项目的名称和位置,按下OK键后,会一个许可提示。(在ASF3.19中需要同意两个许可,在更早的版本中只需要同意一个许可。)不知道为什么一个例程也搞得这么复杂。
同意后,就会自动创建项目文件,这需要一点时间,通常是10s-60s,与计算机配置有关。
完成后就可以编译程序了。第一次编译会比较慢,因为包括ASF驱动的所有程序都复制到项目目录下,全部源文件都需要重新编译。这通常需要30s-3minute。
在下载或者仿真前,还需要选择一下仿真器,这里当然是选择板载的EDBG仿真器了。
本来到这里就可以结束了,但是我发现了一个奇怪的现象,于是有了下面的测试。问题就是温度显示了20次左右后,突然温度就变为0了。开始以为温度传感器有问题,但是按下RESET后,温度显示正常,然后20次后又变为0了,重复几次都是这样。看起来这就不是硬件问题了,于是又尝试了ASF旧的例程。安装ASF3.19后,旧版本的ASF还在,这一点比较好,可以方便的进行选择和比较。找了最早支持SAM4S Xplained的ASF,是ASF 3.7.3版,因为一般来说第一版是测试最仔细的,bug也较少。按上面同样的步骤操作,这次温度显示正常了,连续运行很长时间也没有问题,看起来就是ASF的问题了。
当温度小于0度或者读取温度错误的时候,温度就会变为0。继续分析at30tse_read_temperature函数,它在{project}\src\ASF\common\components\memory\eeprom\at30tse75x\目录下。这个函数主要是调用另外一个函数
/* Read the 16-bit temperature register. */
error_code = at30tse_read_register(AT30TSE_TEMPERATURE_REG,
AT30TSE_NON_VOLATILE_REG, AT30TSE_TEMPERATURE_REG_SIZE, buffer);
而在at30tse_read_register函数中,主要是调用另外一个函数twi_master_read。
return twi_master_read(BOARD_AT30TSE_TWI, &packet);
再看看twi_master_read函数,它再twi.c这个文件中。twi.c的位置在{project}\src\ASF\sam\drivers\twi\下。我们用文件比较工具(我使用的是Totalcmd内置的文件比较功能)对比了新旧版本ASF中这两个函数,发现主要不同如下:
新版本
uint32_t timeout = TWI_TIMEOUT;
while (cnt > 0) {
status = p_twi->TWI_SR;
if (status & TWI_SR_NACK) {
return TWI_RECEIVE_NACK;
}
if (!timeout--) {
return TWI_ERROR_TIMEOUT;
}
/* Last byte ? */
if (cnt == 1 && !stop_sent) {
p_twi->TWI_CR = TWI_CR_STOP;
stop_sent = 1;
}
if (!(status & TWI_SR_RXRDY)) {
continue;
}
*buffer++ = p_twi->TWI_RHR;
cnt--;
timeout = TWI_TIMEOUT;
}
旧版本
桔黄色部分就是新版本增加的内容,主要就是增加了超时保护,它的默认值在twi.h中定义为15000。尝试将这个默认值修改为150000,在编译下载,这次结果正常了。
本来新版本ASF的想法是好的,为twi操作增加一个超时保护,防止因为意外造成程序死锁,但是因为一些问题,造成运行结果不稳定,估计这个版本的ASF也是没有经过完整测试的。
小结:
文章评论(0条评论)
登录后参与讨论