首先说声对不起,之所以起这个名字,主要是想吸引赢球,我本身也是菜鸟一个,希望与所有菜鸟共勉之。 自从选用STR912这款芯片后,当然是看中了这款芯片自带的网口这个功能,就开始郁闷的折腾的开始,网上一搜寻,该芯片的资料了少的可怜,不知道是ST推广力度够,还是芯片本身的市场应用的缺陷(多少感觉有点像**肋)。 在开发中,遇到不少问题,网上求助的不少,但都是无人问津。现在想想并不少网上没有高手,只是问问题这种事情,问题的原因可能太多,他人是无法确切了解你软硬件的设计,只能猜想一些,我就见过一个人在帖子上发问题,下面回答的也很热烈,什么延时呀,电流呀,上拉电阻等等,最后那个人自己澄清是一个引脚虚焊了。。。。所以我觉得当你提问后有人正好能解决,那相当于你买彩票中奖了,大多数只能靠自己了。 言归正传,跑到ST网站下了GPIO的例子,开始嘛,当然从跑马灯学起嘛。程序下载,一打开就加了N多文件,心想一个IO至于这么变态。原来是ST已经把各个功能模块封装成库了,我们对I/O操作,根本不需要和寄存器打交道了,只需要调用库里面的函数就可以了,就像IAP函数一样,只需要只能参数的含义就可以了。我心里想,这到底是好事还是坏事,这样工程师甚至在了解寄存器的,不用看用户手册,就可以开发了,这也就是说如果来一个新人,他也能很快的上手,开发Easy了(注:库是会有bug的,所以小心)。 我TMD的心想,你搞再简单一点呀,最好启动代码也省了,弹出一个对话框,你只要输入,中断向量表的函数名,地址,堆栈名,堆栈地址什么的,它自动生成得了。或者更牛X直接出厂的时候就把各种驱动BSP烧好,我就自己直接像VC一样在上位机开发得了。 I/O调试没费多长时间,这个也没必要讲了,只是觉得一个很简单的I/O翻转指令,用库文件写起来就变得复杂了,当然你可以直接找个指针直接指想该寄存器的内存地址,对寄存器直接操作。后来开始调试I2C 。当然了,没看数据手册,直接跑例程了。 问题1:看到例子有这样的句子while( ! I2C_CheckEvent(I2C0, I2C_EVENT_MASTER_MODE_SELECT) ); 心想这样给个例子也太不负责了,这I/O一出问题岂不要死在这里,我搞了一个循环while判断,至于这个时间,由你的I2C速率决定,这样保证了不死机。 问题 2: 热插拔导致I2C死锁,I2C不支持热插拔,打算在下一版加一个热插拔芯片,不知道有没有用?现在只好通过软件解决,当I2C通信出问题后,将I2C重新初始化。当然有时候是主导致从死,有时候是从导致主死,具体问题具体分析。 问题3:I2C广播包。由于从我采用中断方式,直接用它的库,你会发现它没有考虑这种情况,那就自己添加吧,就是寄存器这个I2C_FLAG_GCAL 对应普通的包有定义 #define I2C_EVENT_SLAVE_BYTE_RECEIVED ( I2C_FLAG_EVF | I2C_FLAG_BUSY | I2C_FLAG_BTF ) 自己添加 #define I2C_EVENT_SLAVE_BYTE_RECEIVED_GCAL ( I2C_FLAG_EVF | I2C_FLAG_BUSY | I2C_FLAG_BTF|I2C_FLAG_GCAL )
写到这里,让高手见笑了,以后还想重点写网口调试的经历,从硬件,软件,远程下载,可谓处处碰壁,那可是折腾的不行了,但我相信一句话what doesn't kill me makes me stronger!
|