搜索
bottom↓
回复: 6

请教马老师:TWI采用中断编程的方法

[复制链接]

出0入0汤圆

发表于 2005-8-18 10:09:49 | 显示全部楼层 |阅读模式
马老师,您好!我是个学生,前段时间拜读过您的那个“URAT(RS232)低层驱动+中间层软件示例”文章后,使我很受启发,在编程上思想上有了比较大改变。

   现在,我学习到TWI编程了,采用查询的方法我已经调试成功了,现在想采用中断的方法,但是感觉跟UART有比较大的差别,更复杂了,有点不知该如何进行的感觉,请您指点一下!能否给个简单的代码举例,谢谢!

出0入0汤圆

 楼主| 发表于 2005-8-25 14:13:30 | 显示全部楼层
我自己仿照Uart编程的方法编了个中断方式的程序,进行双机通讯的,如下,希望大家指点一下(代码片断)



#define Twi_ACK()                (TWCR = (1<<TWEA)|(1<<TWINT)|(1<<TWEN)|(1<<TWIE))

#define Twi_NoACK()        (TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE))

发送方:



/*======= TWI中断处理 ==============*/

SIGNAL (SIG_2WIRE_SERIAL)

{

        switch(TW_STATUS)

        {

                case TW_START:

                case TW_REP_START:

                        TWDR = SLA_W;

                        Twi_NoACK();

                        break;

                case TW_MT_SLA_ACK:

                        if(twi_counter)

                        {

                                --twi_counter;

                                TWDR = twi_buf[twi_rd_index];

                                if(++twi_rd_index == TWI_BUF_SIZE) twi_rd_index = 0;

                        }

                        Twi_NoACK();

                        break;

                case TW_MT_DATA_ACK:

                        if(twi_counter)

                        {

                                --twi_counter;

                                TWDR = twi_buf[twi_rd_index];

                                if(++twi_rd_index == TWI_BUF_SIZE) twi_rd_index = 0;

                                Twi_NoACK();

                        }

                        else

                                Twi_Stop();

                        break;

                case TW_MT_SLA_NACK:

                        Twi_Stop();

                        break;

                default:

                        Twi_Start();

                        break;

        }

}





/*====== 往TWI口缓冲区中发送数据 =======*/

void PutTwiChar(uchar c)

{

        while(twi_counter == TWI_BUF_SIZE);

        cli();

//--------------------------------------------------------//////////

        if(twi_counter);// ||((TWCR & _BV(TWINT)) == 0));////////// *******

//--------------------------------------------------------//////////

        else

                Twi_Start();



        twi_buf[twi_wr_index] = c;

        if(++twi_wr_index == TWI_BUF_SIZE) twi_wr_index = 0;

        ++twi_counter ;

        sei();

}



接收方:

SIGNAL (SIG_2WIRE_SERIAL)

{

        switch(TW_STATUS)

        {

                case TW_SR_SLA_ACK:

                        Twi_ACK();

                        break;

                case TW_SR_DATA_ACK:

                        twi_buf[twi_wr_index] = TWDR;

                        ++ twi_counter;

                        if(++twi_wr_index == TWI_BUF_SIZE) twi_wr_index = 0;

                        Twi_ACK();

                        break;

                case TW_SR_STOP:

                        Twi_ACK();

                        break;

                default:

                        Twi_ACK();

                        break;

        }

}



单向的数据传输,用起来还可以(做显示用,用一个单片机负责显示,接收主机的数据),只是标注 ******* 的地方,可能不稳定。

if(twi_counter);// ||((TWCR & _BV(TWINT)) == 0))

如果把 ||((TWCR & _BV(TWINT)) == 0)) 这个条件加上,运行有些问题;如果不判断可能会在发送还没有完成时写入Start把数据损坏了,这个地方不是很确定,还请马老师指点一下。也就是说我的问题是在我发送数据还没有结束时(TWINT为低时)如果发送Start命令会不会冲了我正在发送的数据,串口会好像


-----此内容被c7140于2005-08-25,14:21:28编辑过

出0入0汤圆

发表于 2005-9-13 08:38:45 | 显示全部楼层
TWI 接口是否可以接8个负载.

出0入0汤圆

发表于 2005-9-19 15:55:29 | 显示全部楼层




另外,请问TW_STATUS是编译器已经定义好的吗?

出0入0汤圆

发表于 2005-9-19 22:03:57 | 显示全部楼层
哦,找到了。的确如此,在avr/include下

出0入0汤圆

发表于 2011-6-9 21:56:19 | 显示全部楼层
对啊,这个例子马老师说是参考章节末的参考文献,但怎么办都找不到呢

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-11 11:21

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

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