搜索
bottom↓
回复: 28

求助:ATtiny26L通用串行接口USI中TWI编程例程

[复制链接]

出0入0汤圆

发表于 2005-1-27 23:22:06 | 显示全部楼层 |阅读模式
看了ATtiny26L通用串行接口USI,感觉很怪异,功能虽多,但不知TWI两线同步数据传输主从设备有什么好的方法,有用过的能否给个例程???



谢谢!!!



HotPower@126.com

出0入0汤圆

发表于 2005-1-28 00:47:54 | 显示全部楼层
"TWI (I2C) Example using Attiny 26 as Slave"

点击此处下载armok0136062.zip

刚好看见,摘自以下网址

http://www.avrfreaks.net/

出0入0汤圆

 楼主| 发表于 2005-1-28 01:06:26 | 显示全部楼层
非常感谢testcode,刚编译通过...



T26L容量就是有些小,这个程序就用了714个字节...



真心感谢...

出0入0汤圆

发表于 2005-1-28 02:38:02 | 显示全部楼层
是的,如果速度不是要求很快,可以试一下以下例子

点击此处下载armok0136142.zip

摘自以下网址:

http://www.avrfreaks.net/

出0入0汤圆

 楼主| 发表于 2005-1-28 07:39:32 | 显示全部楼层
谢谢testcode!!!



http://www.avrfreaks.net/有关T26L的问题一共有6页,有本主题的例程只有2个...



不知testcode的这个armok0136142.zip如何???



armok0136142.zip打不开,好像有病毒???



谢谢!!!

出0入0汤圆

发表于 2005-1-28 11:34:50 | 显示全部楼层
//From I2C.h

extern        void i2c_stop(void);

extern        void i2c_send(uc data);

extern        uc i2c_receive(uc end);

extern void i2c_set_addr_r(uc addr);

extern void i2c_set_addr_w(uc addr);



#define READ    1

#define WRITE   0



#define QUIT            1

#define CONTINUE        0



/////////////////////////////////////////////////////////////

//From I2C.c

#include <io.h>



//You should edit only the next three defines:

#define        SDA        PD5

#define        SCL        PD6

#define        I2C_PORT_SDA        DDRD

#define        I2C_PORT_SCL        DDRD







//Shortcuts to the pins

#define        SCL_1        cbi(I2C_PORT_SCL, SCL);

#define        SCL_0        sbi(I2C_PORT_SCL, SCL);

#define        SDA_1        cbi(I2C_PORT_SDA, SDA);

#define        SDA_0        sbi(I2C_PORT_SDA , SDA);

#define dly()        i2c_delay();



#define        RELEASE_SDA        cbi(I2C_PORT_SDA, SDA);



//READ or WRITE operation/request

#define READ        1

#define WRITE        0



//whether we want to continue the read operation

#define        QUIT                1

#define        CONTINUE        0



typedef unsigned char uc;



void error(void)

{

        //As we don't have external eeprom,  read data from the internal EEPROM

        //Should write it later

        //

        //Should be defined as apropriate

}



//Some experiments needed here

void i2c_delay(void)

{

        uc i;

        for(i=1; i<5; i++);

}





void i2c_start(void)

{

        SDA_1

        SCL_1

        dly()

        SDA_0

        dly()

        SCL_0

        dly()

}





void i2c_stop(void)

{

        SDA_0

        SCL_1

        dly()

        SDA_1

        dly()

        SCL_0

        dly()

}





void i2c_send(uc data)

{

        register uc i;

        for(i=0; i<=7; i++) {

                if ( data & 0x80)

                        SDA_1

                else

                        SDA_0

                SCL_1

                dly()

                SCL_0

                dly()

                data = data << 1;

        }

        RELEASE_SDA

        SCL_1

        dly()

        if( bit_is_clear(PIND,SDA) ) {

                SCL_0

                dly()       

        } else

                error();

}





uc i2c_receive(uc end)

{

        RELEASE_SDA

        uc i,data;

        data=0;

        for(i=0; i<=7; i++) {

                SCL_1

                dly()

                data <<= 1;

                if(bit_is_set(PIND,SDA))

                        data++;

                SCL_0

                dly()

        }

        if(end==CONTINUE)        //Set ACK

                SDA_0

        else                         //Set NO ACK

                SDA_1

        SCL_1

        dly()

        SCL_0

        dly()



        return data;

}





//Some useful functions  for 24C04

//Setting the addres and the type of operation (READ/WRITE)

//These are needed to set the internal latch of the memory

void i2c_set_addr_r(uc addr)

{

        i2c_start();

        i2c_send(0xA0); //WRITE address

        i2c_send(addr);        //Write internal memory latch

        i2c_start();



        i2c_send(0xA1); //Set to READ

}



void i2c_set_addr_w(uc addr)

{

        i2c_start();

        i2c_send(0xA0); //WRITE address

        i2c_send(addr);

}

出0入0汤圆

 楼主| 发表于 2005-1-28 12:30:41 | 显示全部楼层
谢谢testcode!!!



我想I2C多MCU通讯...【5楼】例程不行,【2楼】正在研究...



主要T26L容量太小,不太满意...

出0入0汤圆

发表于 2005-1-28 14:00:28 | 显示全部楼层
为什么不试一试Attiny2313?

有完整的USART,也可以多MCU通讯。

出0入0汤圆

 楼主| 发表于 2005-1-28 18:26:00 | 显示全部楼层
关键是需要T26L的部分功能,而Attiny2313可能不行吧...



今天下午用C++封装了USI类,还未通过硬件测试...



非常感谢testcode!!!

出0入0汤圆

 楼主| 发表于 2005-1-30 23:50:46 | 显示全部楼层
已通过硬件的双向通信...



郁闷呀!!!老外的C程序就用了714个字节...,我用C++封装了USI类、ADC类和PWM类也不过1K字节。



真不敢相信C++有如此本事,通过硬件测试后--服了...



看来我没选错GCCAVR C++...

出0入0汤圆

发表于 2005-1-31 16:31:25 | 显示全部楼层
用Tiny26 L就是要惜字如金,我以前就说个TINY26 好就是好,最头痛是空间少,

看来楼主是有所体会啦。所以要精简代码......

出0入0汤圆

发表于 2005-1-31 17:25:30 | 显示全部楼层
landem_2004你tiny26用在什么产品上?我调例程调的快没脾气啦!

出0入0汤圆

发表于 2005-1-31 18:47:28 | 显示全部楼层
做冷库温度控制器。

出0入0汤圆

 楼主| 发表于 2005-2-1 00:19:37 | 显示全部楼层
刚调完PWM和ADC模块,感觉T26L就是和“人不一样”,...



就是害怕容量问题...不过我用C++封装了PWM,ADC,USI才用了1K不到,再干些别的事情



看来问题不大。

出0入0汤圆

发表于 2005-2-3 10:08:46 | 显示全部楼层
听朋友说他们公司TINY26L批量能做到6块出头,这样的话TINY26L还有点前途哦!

出0入0汤圆

发表于 2005-3-26 14:36:25 | 显示全部楼层
請教ATtiny26L的USI通訊



    大家好!我剛用ATtiny26L不久,手冊上USI通訊部分看的是迷迷胡胡的。不知它的兩線模式到底該怎樣用。只調的SCL上有波形,而SDA上卻沒有數據輸出。那位用過的高手能否給段代碼。主從模式。最好是漚編寫的!!!!!!!謝謝!!!!!

出0入0汤圆

 楼主| 发表于 2005-12-3 08:51:50 | 显示全部楼层
现在Tiny26L只有5元左右了,看来当初的选择T26L和选择GCCAVR都是正确的.



虽然M16L等也能凑合满足我的设计要求,但M8L+T26L的组合还是比单片M16L好些.



这样分工明确,提高了系统运行效率,但就是长线通讯较头晕.

出0入0汤圆

发表于 2006-12-27 12:40:58 | 显示全部楼层
把酷帖顶起!把酷帖顶齐!

出0入0汤圆

发表于 2009-1-21 10:35:33 | 显示全部楼层
还有人关注么?

我的tiny26从机用下边的这个例程没通过,主机总是收不到ACK,谁能帮帮我啊!!!!



"TWI&nbsp;(I2C)&nbsp;Example&nbsp;using&nbsp;Attiny&nbsp;26&nbsp;as&nbsp;Slave"&nbsp;

点击此处下载armok0136062.zip&nbsp;

刚好看见,摘自以下网址&nbsp;

http://www.avrfreaks.net/&nbsp;

出0入0汤圆

发表于 2010-6-23 14:04:08 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-6-24 14:10:11 | 显示全部楼层
回复【楼主位】hotpower  菜农   
-----------------------------------------------------------------------

mark 学习了

出0入0汤圆

发表于 2011-3-31 16:33:07 | 显示全部楼层
这个好像不是用TWI方式读写的24C02,有用USI的TWI方式读取24C02的例子吗?

出0入0汤圆

发表于 2012-1-14 15:20:41 | 显示全部楼层
刚好公司项目用上这个,谢谢了!

出0入0汤圆

发表于 2012-2-13 16:56:20 | 显示全部楼层
不知道为什么,我使用此例程,发现数据转送总是会左移1位!

出0入0汤圆

发表于 2012-2-16 17:27:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-8-1 15:32:24 | 显示全部楼层
顶起来,学习了

出0入0汤圆

发表于 2012-8-1 16:38:31 | 显示全部楼层
MARK

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-6 14:52

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

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