工作需要,最近忙于调试一款2.4G无线芯片解决方案,采用的芯片是ARF2496K,该芯片要求外部供电3.3V,所以不能直接使用普通的C51控制,除非接转换芯片。AT89S52、STC89C52都没有用武之处了,所以主控选型初步定为STM8S系列,最终调试时所使用的为STM8S103F3。
一开始,我们使用的是由博巨兴提供的方案,主控为BJX8F101BTG,其实这片芯片的核心就是STM8S。外加一个仿真器BJX-LINK-001,按我的理解这也就是ST-LINK仿真器。
第一步,就是确定主控能正常工作,STM8S的最小系统是在淘宝上直接购买了一块STM8S103F3小核心板,这个板子自带两个LED灯,一个用于指示电源,另一个可供I/O控制。而且将所有的管脚都引出来了,很方便外接ARF2496K芯片。拿到这板后,自己焊接了排针,万用表测试线路是正常的了。
万事俱备,开工了,打开一个控制LED灯的程序,准备烧录时,发现一个错误: “chip does not answer” ,如下图:
仿真器肯定是没选错的,虽然他没有标明是STLINK,但换别的时候都提示错误。
初步怀疑我芯片的问题,换了一块核心板还是这样,便掉转矛头考虑是不是仿真器的问题,在GOOGLE搜索chip does not answer ,答案各种各样,没有什么进展,但得到一个信息就是供电的问题,检查BJX-LINK时发现竟然没有输出电压,查看自带的手册,发现这手册问题很多,讲的都不怎么清楚,示意图也比较模糊。于是认为这个仿真器坏了,最后联系博巨兴,他们那边给出的解释是板子需要另外供电,原来如此,果然,在给芯片供电后一切正常。LED灯闪了。
第二步就是考虑移植ARF2496K代码了,参考ARF2496K datasheet,初步完成一些函数的封装,如SPI操作。最之前还不确定这ARF2496K芯片是不是好的,所以必须先能正常读取内部寄存器值才能往下做开发。
这里遇到个让我纠结了好久的问题,调试时示波器也查看了,管脚也测过了都是正常的,没想到竟然最后的问题出在了FWLIB1.0库的GPIO_ReadInputPin函数上。
代码片段如下:
u8 rf_spi_read(void)
{
u8 i,val = 0;
BitStatus d;
for(i = 0;i < 8;i++)
{
val <<= 1;
d=GPIO_ReadInputPin(ARF_PORT,TRSDAT); //ARF_PORT 就是GPIOC,
//if (GPIO_ReadInputPin(ARF_PORT,TRSDAT)==1) //检测TRSDAT位是不是为高
if(GPIOC->IDR&TRSDAT) //检测TRSDAT位是不是为高
val |= 1;
TRSCLK_U;
nop();nop();nop();
TRSCLK_D;
}
return val;
}
之前并没有使用 if(GPIOC->IDR&TRSDAT) 这种方式,而是使用的库函数if(GPIO_ReadInputPin(ARF_PORT,TRSDAT)==1),但总是没有进入过,一开始以为是其它如延时,访问时序的问题所致,将那些代码仔细检查过了都没有问题。于是考虑将GPIO_ReadInputPin(ARF_PORT,TRSDAT)读出来看看,是什么玩意。d=GPIO_ReadInputPin(ARF_PORT,TRSDAT); 总是返回为0 也就是RESET状态。
原型如下:
BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{
return ((BitStatus)(GPIOx->IDR & (u8)GPIO_Pin));
}
typedef enum {
RESET = 0,
SET = !RESET
}
FlagStatus, ITStatus, BitStatus;
TRSDAT是连接在PC3口,这里PC_IDR 为0x88 10001000b 第3位为1,意味着是存在高电平的,但变量d的值仍是0 RESET,操蛋了个去。
接着往下执行,下图:
完全正常,可问题就是为什么这
GPIO_ReadInputPin(ARF_PORT,TRSDAT)
就不正常呢????
反正是可以正常读出寄存器值了,接着往下写驱动了。
总结:
BJX8F101BTG 就是STM8S系列,但有些管脚上的微微差别。
BJX-LINK-001仿真器就是ST-LINK。
出现"chip does not answer" 很可能需要给板子供电。
使用库函数时一定注意用法,而且不能全信。