搜索
bottom↓
回复: 7

请教一个关于PIC CCSC I2C程序问题?

[复制链接]

出0入0汤圆

发表于 2010-10-16 11:38:48 | 显示全部楼层 |阅读模式
请教一个关于PIC CCSC I2C程序问题:
   
在ccsc中自带的I2C函数中(No automatic timeout is provided in this function)。
也就是说当执行到I2c写函数时,如没有I2C器件,则单片机在会I2C函数中死机。
请教此种情况怎么解决?

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-10-16 11:42:16 | 显示全部楼层
write your own routines.

出0入0汤圆

 楼主| 发表于 2010-10-16 13:34:40 | 显示全部楼层
write your own routines
===============================
我也这样做了,用I2C读数是正确的,但是会影响到我其他的程序。
我不知道是编译器的问题,还是我I2C的问题(以前没有写过,但我跟很多例子比较了基本无差别)。

出0入42汤圆

发表于 2010-10-16 22:11:26 | 显示全部楼层
关注。。。。至少我现在还没考虑这么细致过。 从来都是用硬件I2C.



我刚刚看了一下帮助文件。有看了代码,应该不会陷入死等呀?
------------------------------------------------------------

void init_ext_eeprom() {
   output_float(EEPROM_SCL);
   output_float(EEPROM_SDA);
}

int1 ext_eeprom_ready() {
   int1 ack;
   i2c_start();            // If the write command is acknowledged,
   ack = i2c_write(0xa0);  // then the device is ready.
   i2c_stop();
   return !ack;
}

void write_ext_eeprom(EEPROM_ADDRESS address, BYTE data) {
   while(!ext_eeprom_ready());
   i2c_start();
   i2c_write((0xa0|(BYTE)(address>>7))&0xfe);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
}

出0入0汤圆

 楼主| 发表于 2010-10-17 10:45:48 | 显示全部楼层
回复【3楼】wangjiati =_=
-----------------------------------------------------------------------

i2c_write (data)帮助中前面提到“This function returns the ACK Bit.”,照这样说,不会死等。

但帮助中后面一句“No automatic timeout is provided in this function.”又是什么意思呢?
我理解为会死等。

我的程序片段如下:
   i2c_start();
   i2c_write(0x04);
   i2c_write(0xfe);
   i2c_write(0x06);
   i2c_stop();

没有用到 output_float(); 有接上拉电阻。

以上,没有I2C器件就会陷入死等。


用自己写的I2C程序,输出的数据是对的(自动输出的是一个电压,用万用表量),但是会影响到其他程序。

愁啊。

出0入42汤圆

发表于 2010-10-17 14:56:11 | 显示全部楼层
你看到的帮助应该是这句话:
Sends a single byte over the I2C interface.
In master mode this function will generate a clock with the data and in slave mode it will wait for the clock from the master.
No automatic timeout is provided in this function.  
This function returns the ACK bit.
The LSB of the first write after a start determines the direction of data transfer (0 is master to slave).

Note that specific I2C protocol depends on the slave device.



我给你翻了一下书:
找到关于 ack = i2c_write(0xa0);的一些解释  
/*---------------------------------------------------
在I2C输出1字节的数据。
主动模式输出时钟,从动模式时等待从动主机方来的时钟。
不使用内置SSP模块时,不会发生超时溢出,故一直等待到发送结束。
发送结束,返回ACK位。
正常ACK时返回0,没有ACK时返回1.
---------------------------------------------------*/

我理解的是 在使用I2C时 用主控模式,


#use I2C(master, sda=PIN_B0, scl=PIN_B1)

出0入0汤圆

 楼主| 发表于 2010-10-17 18:08:47 | 显示全部楼层
回复【5楼】wangjiati =_=
-----------------------------------------------------------------------
多谢关注,我就是用的主控模式#use I2C(master, sda=PIN_B0, scl=PIN_B1)

明天上班再看看,公司有点变态,竟然不让上www网。

出0入0汤圆

 楼主| 发表于 2010-10-18 20:16:55 | 显示全部楼层
今天在自己的写的I2C程序中的stop()函数结尾处加了output_float(I2C_SCL);  output_float(I2C_SDA); .结果变好了,不影响其他的程序段了。

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

本版积分规则

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

GMT+8, 2024-5-20 09:31

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

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