搜索
bottom↓
回复: 9

求pic16f883平台c语言写的iic主控程序

[复制链接]

出0入0汤圆

发表于 2011-7-6 00:45:49 | 显示全部楼层 |阅读模式
mchp上给pic16发的iic程序都是汇编的。求一个基于hi-tech c的iic程序。
看了几天资料,对于读写变换还没搞懂。搭的平台上,似乎ssif已经有动作,说明从机已经有ack动作。但是实用的操控命令没有弄机密。现求帮助!
多谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2011-7-9 21:17:28 | 显示全部楼层
发现怎么编程似乎都通过。细查电路,发现CPL空闲时仍旧为低电压。似乎是硬件问题。

再换个iic平台看看吧。

出0入0汤圆

 楼主| 发表于 2011-7-10 17:13:24 | 显示全部楼层
发现从机在主机给的指令序列有问题时,会占死SCL信号,并一直保持(我的从机是个iic口的传感器芯片)。这时为恢复正常必须把电源关闭一下。
指令序列怎么判断是否正常?没有合适的例程。

出0入0汤圆

 楼主| 发表于 2011-7-10 21:19:02 | 显示全部楼层
问题基本解决。以下是相关程序。通信对象为MMA7660加速度传感器

//初始化MSSP模块
SSPSTAT=0x80;                //master with standard speed.
SSPADD = 29;                //12M, 100K
SSPCON = 0X28;                //enable mssp, master mode
SSPCON2 = 0;
//以下为初始化MMA766O
ACKDT=0;                        //ACK TO SLAVE AFTER RECEIVING
SSPCON2 |= 1;                //SET SEN
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
SSPBUF = 0X98;                //ADRRESS OF MMA7660
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
SSPBUF = 0X05;                        // MODE OF MMA7660
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
SSPBUF = 0X01;                // R05 OF MMA7660
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
SSPBUF = 0X01;                        // R06 OF MMA7660,DUMY
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
SSPBUF = 0X09;                        // R07 OF MMA7660
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
SSPBUF = 0X3F;                        // R08 OF MMA7660
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
SSPCON2 |= 4;                //SET PEN
while (!SSPIF);                //WAIT NACK SENT
SSPIF =0;                        //CLEAR FLAG
//读一次MMA7660
ACKDT=0;                        //ACK TO SLAVE AFTER RECEIVING
SSPCON2 |= 1;                //SET SEN
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
SSPBUF = 0X98;                //ADRRESS OF MMA7660,WRITE
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
SSPBUF = 0X00;                // XOUT OF MMA7660
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
RSEN=1;                                //RESTART
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
SSPBUF = 0X99;                //ADRRESS OF MMA7660,READ
while (!SSPIF);                //WAIT ACK FROM SLAVE
SSPIF =0;                        //CLEAR FLAG
ACKDT=0;                        //ACK FLAG
RCEN=1;                                //RECEIVING
while (RCEN);                //WAIT NACK SENT
ACKEN=1;                        //NACK
while (ACKEN);                //WAIT TO CLEAR FLAG
gotiic1=SSPBUF;                //RECEIVED BYTE1
ACKDT=1;                        //NACK FLAG
RCEN=1;
while (RCEN);                //WAIT RECEIVING
ACKEN=1;
while (ACKEN);                //NON ACK
gotiic2=SSPBUF;                //RECEIVED BYTE2
SSPCON2 |= 4;                //SET PEN
while (!SSPIF);                //WAIT PEN
SSPIF =0;                        //CLEAR FLAG

出0入0汤圆

 楼主| 发表于 2011-7-11 20:49:57 | 显示全部楼层
回复【3楼】surf_131
-----------------------------------------------------------------------

调试中发现,由于从机不具有带电重启功能,一旦在调试中中断通信,从机MMA7660会“吊死”。此时只能整个系统都去掉电源再连接。

看来没有软件办法能够解决此问题。考虑加个三极管给从机供电,用主机的一个端口来控制从机上电。

出0入0汤圆

 楼主| 发表于 2011-7-12 17:02:32 | 显示全部楼层
经过测试发现,MMA7660的精度实在太差。本来分辨率只有3度左右,动态变化居然还有2个LSB。于是换用ADXL345。

起初发现读出的数值为全1。后来插入断点,发现第一次执行得到的数值正确。第二次再执行才会变成全1(0xff)。这是怎么回事?有熟悉这家该款芯片的高人,请给指教一二。

出0入0汤圆

 楼主| 发表于 2011-7-12 18:56:12 | 显示全部楼层
继续查找ADXL345驱动的问题。发现,将程序前面的带写入寄存器部分和读出寄存器部分在主循环中每次都执行一遍,读数就一直正确。现在等于发现通过IIC口读写ADXL345的程序有一点比较软的问题,具体是怎么回事,请iic编程高手指点。

出0入0汤圆

发表于 2011-7-13 09:04:32 | 显示全部楼层
"以下是相关程序。"

if that's how you write code, you probably should think about a career in anything but coding.

出0入0汤圆

 楼主| 发表于 2011-7-13 09:43:16 | 显示全部楼层
回复【7楼】millwood0
-----------------------------------------------------------------------

我见过别人给iic编程的实例,多重函数调用,执行起来很麻烦。我这里不过是实际核查iic各个信号与动作之间的关系,那些检查sspif的地方,都有可以替换的标志,比如rcen/rsen/ackstat等。用sspif是为了最稳妥。这段程序还插入过若干asm("nop")句子增加延时呢。

原理性调试完毕之后,当然还要查效率,最后封装成读和写的函数。

其实多层调用的函数结构,整个过程也一样繁琐。这是iic协议的过错,把过多核查任务交给了上层。相比较而言,rs-232在分层方面就有效得多。而can简直就是完美了。

出0入0汤圆

发表于 2013-5-16 17:17:29 | 显示全部楼层
mark一下。。。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-3 16:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表