股票

使用ASF库函数对SAM4S引脚电平读取的初始化问题

这两天折腾SPI,比较烦。先是用的硬件SPI,初始化完成,使用示波器检测MOSI,MISO,SCK,都有信号,但是读出来的结果就是不对。怀疑速度太快,换模拟方式驱动,同样信号正常,但是读出的数据依然不对,快疯了都。

没办法,架设示波器,抓到了从机的返回包,一个bit一个bit的计算,发现返回数据完全正常!!!这意味着是mcu在读取从机数据的时候错了!当然一开始也怀疑过这个问题,专门测试了读取函数,用的方式是MISO直接拉高或者拉低,发现拉高读1拉低读0,没问题啊。然而,转了一圈还是回到原地。想了想,更郁闷的是,前两天调试IIC通信,用到也是模拟方式,同样读取引脚高低电平,最终是测试通过了。

拿这两个程序进行比较,发现就初始化的时候不同。由于IIC的SDA口需要随时切换输入输出,所以初始化的时候配置为输出,然后调用模式更改函数,这样:

[task]

gpio_configure_pin[PIO_PB4_IDX, PIO_OUTPUT_1|PIO_DEFAULT];

ioport_set_pin_dir[PIO_PB4_IDX, IOPORT_DIR_INPUT];

[/task]

使用ioport_set_pin_dir随时切换输入输出状态,工作完全正常。

在SPI模拟口,由于MISO不需要切换工作状态,初始化就直接配置成输入口了:

[task]

gpio_configure_pin[PIO_PA12_IDX, PIO_INPUT|PIO_PULLUP|PIO_DEBOUNCE];

[/task]

然后就在这里出问题了。我读取电平调用的是函数pio_get_pin_value(uint32_t ul_pin),在asf的函数说明中有这么一句:

If pin is output: a pull-up or pull-down could hide the actual value. The function \ref pin_get can be called to get the actual pin output level.

If pin is input: PIOx must be clocked to sample the signal. See PMC driver.

直接把引脚初始化为输入时,如果不处理PMC的问题,读取稳定电平没太大问题,但是读取变化电平就不行了,并不能保证读取正确。把这里改成和IIC一样的初始化方式,先输出,再改输入,SPI工作正常了。

虽然程序调通了,但是还有不少问题仍然存在,硬件SPI工作不正常,这个原因没有查明。我还用到另一个中断IO口,读取引脚电平也是正常的,当然那个初始化比较复杂,有对PMC的处理,但是具体原理还没了解,以后有时间再查吧。

打赏
原文链接:,转发请注明来源!

发表评论