当前位置: 代码迷 >> 驱动开发 >> 关于单片机驱动的有关问题
  详细解决方案

关于单片机驱动的有关问题

热度:67   发布时间:2016-04-28 10:42:11.0
关于单片机驱动的问题
本帖最后由 XiangJianHeTaiJi 于 2012-11-19 18:07:28 编辑 (不知道为什么显示不出图片)
首先,在这里弱弱的问一句,这个板块应该可以发单片机的驱动问题吧?看到这里的基本都是LINUX字眼,顿时觉得自己弱爆了。。。不知道有没有来错地方。
事情是这样的,今年大二,从大一开始自学单片机。经过一年的学习,觉得自己有必要学习一下如何写模块或者芯片的驱动程序之类比较底层的东西,之前都是买来模块,拿了别人的驱动程序,然后拼装在一起调参数,调程序,仅此而已,感觉自己学不到什么东西。
好了,开始说下正题。
我一直有个疑问,究竟该如何根据时序图来看驱动程序。
将问题细分一下:
1,我看过一篇nrf24L01的数据手册,英文的,上面有时序图,但是并没有给出具体时间数据(之前看过的很多时序图都是有一大堆Txx,Txx的),英文的应该是官方的吧,纯净的无涂改的,那如何根据这样的时序图来写驱动呢?
2,今天在看1302时钟芯片的时序图,自己尝试着写了一下驱动,但是失败了,自己感觉明明都是一步步按着图来写的。
时序图如下:
读:
[img=http://b158.photo.store.qq.com/psb?/4b26910f-9425-4d30-85a1-3a84ade06177/Hvep1AnOH4sDBKPjK12E6TdNu4EbIxBfCKQ.kiIlBkU!/b/dJByLl49KAAA&bo=IAP6AAAAAAABAP4!][/img]
uchar read(uchar com)//com is reg_add
{
uchar i;
res = 1;
for(i=0;i<8;i++)
{
IO = com&0x01;
sclk = 1;
com = com>>1;
sclk = 0;
}
for(i=0;i<8;i++)
{
com = IO&com;
sclk = 1;
com = com<<1;
sclk = 0;
}
res = 0;
return com;
}
写:
[img=http://b159.photo.store.qq.com/psb?/4b26910f-9425-4d30-85a1-3a84ade06177/ZHlLUKZRzktwdN2.6rjL.bK4ikrbYQG8YdaRUQG85FY!/b/dLXH1F6MJwAA&bo=IAMXAQAAAAABABI!][/img]

void write(uchar com,dat)
{
uchar i;
res = 1;
for(i=0;i<8;i++)
{
IO = com&0x01;
sclk = 1;
com = com>>1;
sclk = 0;
}
for(i=0;i<8;i++)
{
IO = dat&0x01;
sclk = 1;
dat = dat<<1;
sclk = 0;
}
res = 0;
}
[img=http://b158.photo.store.qq.com/psb?/4b26910f-9425-4d30-85a1-3a84ade06177/KHJ6cQm5Zm5uz87Ia8Clp38*6fELS*O7BGYI*kRIk9o!/b/dAP*L14tJwAA&bo=IAOgAQAAAAABAKU!][/img]
[img=http://b159.photo.store.qq.com/psb?/4b26910f-9425-4d30-85a1-3a84ade06177/ehz4NmAPcGEvTbcDnbdnhbb5381NnVdZrvyUppVsrFI!/b/dIUDx17cJgAA&bo=IAOFAAAAAAABAIE!][/img]
请大家帮忙看一看,谢谢。
3,因为失败了,所以又找了一个比较简单的1602LCD的时序来练。
这个时序比较简单,所以能工作,但是不稳定,经常出现乱码,我猜想应该是时间控制的不够严格,但是我又想不出什么好办法,自己琢磨着,打开了DEBUG,不怕大家笑话,KEIL接触了一年,DEBUG里面我没几个会用的功能。
根据SEC这一项,一步步的计算每一步执行的时间,算出来的结果吓一跳,数据手册里面的时间单位都是以ns计算的,但是KEIL里面算出来的时间,最短的一步也需要1us,这里说一句,单片机是STC90C516,晶振是11.0592。我想问大家,为什么差别这么大呢?究竟该如何才能知道每两条指令之间的真实时间间隔呢?
有谁能帮帮忙解答一下么,不胜感激。
------最佳解决方案--------------------
用示波器看1302数据线的波形没太大意义,有逻辑分析仪那可以看看。
------其他解决方案--------------------
正确理解接口电路和时序,这个没有错,能够帮助开发和定位问题。
你可以再根据时序 看看你的接口读写发生什么如果有设备的话。

有个问题是,你要弄清楚驱动能够控制哪些信号,怎么控制。
除了数据外,RST,CLK这些是否是这样控制的,一般都是基本寄存器配置好后,发生读写时cpu自动产生这些信号的,不需要驱动再去参与。你可以再看看手册,理解一下。
------其他解决方案--------------------
没看明白你的芯片是啥芯片 需要自己模拟时钟和一些控制信号吗? 接口芯片自己不能完成这样的基本控制吗 根据设置?
------其他解决方案--------------------
是啥接口协议啊 自己模拟这些要求应该很高的。
你可以自己拿示波器 分析仪来看你接口实际逻辑 看看问题在那
------其他解决方案--------------------
要看你的指令周期是多少?一般I2C总线最高速率是400K一下,算一下要延时多长时间。
------其他解决方案--------------------
1602能够正常显示,说明驱动基本没什么大问题。出现乱码,可能是地址设置,字符写入有问题。1302实在解决不了网上有很多驱动,可以拿来参考。上手了之后,其他模块的驱动编写思路也形成了。
------其他解决方案--------------------
这是读时序图

------其他解决方案--------------------
这是写时序图:


下面是具体时间数据:




------其他解决方案--------------------
  相关解决方案