其实,总结起来就是要思路明确。
第一歩,整理整个流程,写接口,然后正式调试。
I2C接口,首先我们用的是硬件I2C,花了大半天的时间调试接口,主要一些细节方面,例如传输的字节,有的时候length-1的,导致最后一个字节读不到,所以id不对。
数组和指针转换的时候出错了。最后读到id,但是写大数据,会有很多报错,经过读6261d的datasheet,还有实际的验证,发现硬件i2c只能传输
不能超过8个字节,在加上一个字节的地址,总共不能超过9个字节。后来想用dma的方式,简单的试了一下,发现行不通。
第二歩,使用模拟i2c接口。第一个坑是i2c要硬件拉高。第二个是i2c搞反了,有波形,没有ack,找了很久。第三,读写firzz地址来测试,发现不对。检查是因为别人把寄存器地址写死了。
i2c调通后,download firmware ok!成功第一歩。
第三歩,调试中断,直接上代码
EINT_Registration(11, KAL_TRUE, LEVEL_HIGH, frizz_eint_callback, KAL_TRUE);
//EINT_Set_HW_Debounce(11, 2);
EINT_SW_Debounce_Modify(11,0);
EINT_Set_Sensitivity(11, EDGE_SENSITIVE);
EINT_Set_Polarity(11, LEVEL_HIGH);
EINT_UnMask(11);
这里由于基础不扎实,浪费了点时间,因为平时都是简单的使用,外部状态很确定,还可以测量,所以很快能试出来。
而这一次,外部状态不确定,也是由ic发的中断到cpu,外部没有测量器件,所以有点麻烦,下面加强一下eint的知识点:
void EINT_Registration(kal_uint8 eintno, kal_bool Dbounce_En, kal_bool ACT_Polarity, \
void (reg_hisr)(void), kal_bool auto_umask)
第一个参数是中断号
第二个参数是延时,抖动。
第三个参数是重点,ACT_Polarity,上面的例子就是默认状态低,高有效,LEVEL_HIGH。
第四个是回调函数
第五个是否默认打开。
EINT_Set_Sensitivity(11, EDGE_SENSITIVE); 这个的重点在触发方式,边沿触发还是电平触发。
void EINT_Set_Polarity(kal_uint8 eintno, kal_bool ACT_Polarity) 这里也有个ACT_Polarity,这个和EINT_Registration的第三个参数让我很困惑,后来看了下实现。
EINT_Registration的ACT_Polarity实现如下:
/* initialize HW-dependant A-DIE EINT configuration */
ADIE_EINT_HW_Initialize(EINT_GLB_TO_ADIE(eintno), Dbounce_En, ACT_Polarity);
这里应该是硬件初始化为高有效状态
EINT_Set_Polarity的ACT_Polarity实现如下:
ADIE_EINT_Set_Polarity(EINT_GLB_TO_ADIE(eintno), ACT_Polarity);
这里是软件设置外部中断的极性,高有效。所以这个两个状态必须要一致,不知道这里理解错了没有,有机会看到这篇文章的人请留言指点一下。