27676|16

1170

帖子

0

TA的资源

至上芯片

楼主
 

今天搞了AVR的TWI主从机通讯,专门写了一个简单的易于新手看懂的例子程序 [复制链接]

我们有工程师级的程序,相信很多人都看不懂,曾经给人看过。 这次写了个新手级的AVR TWI程序,方便学习者了解TWI工作流程和原理。 显得稍微有点乱,整理下再发上来。 程序实现功能: 主机从0到255循环发送字节到从机,从机收到后返回给主机,当主机收到的数为 0x10 时,主机发送再次从零开始。 硬件连接,两个最小mega16系统板,PC0和PC1互相连接,使用芯片的内部上拉电阻,电路上没有接上拉。 PS:为了保险,建议接1K~10K的上拉电阻到总线上。

最新回复

看看看。。。。。。。。。。   详情 回复 发表于 2020-4-8 07:22
点赞 关注
 

回复
举报

1170

帖子

0

TA的资源

至上芯片

沙发
 

回复: 今天搞了AVR的TWI主从机通讯,专门写了一个简单的易于新手看懂的例子程序

主机主程序 //ICC-AVR application builder : 2007-7-19 9:50:03 // Target : M16 // Crystal: 7.3728Mhz // 作者:古欣 // AVR与虚拟仪器 http://www.avrvi.com //主机从1到255发一个数,收一个数。从机接收到任何数都返回。 //当主机收到的数为0x10时,从零开始发送,主机采用查询方式,从机采用中断方式 #include "config.h" void main(void) { uint8 i=0,tmp=0; //re-enable interrupts DDRC=0X00; PORTC=0x03; //使能内部上拉电阻 twi_master_init(); while(1) { i2c_maste_transt(0x50,i); i++; delay_1s(); tmp=i2c_maste_read(0x50); //读一个数 if(tmp==0x10) i=0; } }
 
 
 

回复

1170

帖子

0

TA的资源

至上芯片

板凳
 

回复: 今天搞了AVR的TWI主从机通讯,专门写了一个简单的易于新手看懂的例子程序

从机主程序: // 作者:古欣 // AVR与虚拟仪器 http://www.avrvi.com // TWI 通讯从机,接受到数据回传给主机 // 关键内容在 中断函数 void twi_isr(void)中 #include "config.h" void main(void) { DDRC=0X00; PORTC=0x03; //使能内部上拉电阻 DDRA=0xff; twi_slave_init(0x50); //初始化为从机,地址0x01。 SEI(); while(1) ; }
 
 
 

回复

1170

帖子

0

TA的资源

至上芯片

4
 

回复: 今天搞了AVR的TWI主从机通讯,专门写了一个简单的易于新手看懂的例子程序

TWI通讯程序范例 ICC

simple_twitest.rar

59.28 KB, 下载次数: 778

rar

 
 
 

回复

1170

帖子

0

TA的资源

至上芯片

5
 

回复: 今天搞了AVR的TWI主从机通讯,专门写了一个简单的易于新手看懂的例子程序

调试通过的AVR mega16 SPI双机通讯例子 (为新手设计,简单易懂) 本程序实现的功能:主机发送1~255,丛机接收并在LED上显示出来。 连接方式: 两个mega16最小系统板 PB4到PB7全部对连。 本程序在本站的最小系统板上测试通过,我向你担保本程序的正确性。 主机程序: //ICC-AVR application builder : 2007-7-18 13:01:11 // Target : M16 // Crystal: 7.3728Mhz // 作者:古欣 // AVR与虚拟仪器 http://www.avrvi.com // 功能:SPI主机模式,循环发送从1~255 #include <iom16v.h> #include <macros.h> void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //SPI initialize // clock rate: 57599hz void spi_init(void) { PORTB |= (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7); DDRB |= (1<<DDB5) | (1<<DDB7) | (1<<DDB4); //Set MOSI, SCK AND SS as outputs SPCR = 0x73; //setup SPI SPSR = 0x00; //setup SPI } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); spi_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void SPI_MasterTransmit(char cData) { PORTB &=~ (1<<PB4); //强制接收方进入从模式 SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式 /* 启动数据传输 */ SPDR = cData; /* 等待传输结束 */ while(!(SPSR & (1<<SPIF))) ; PORTB |= (1<<PB4); } void Delay(void) //延时,没有详细计算 { unsigned int i,j; for(i=1000;i>0;i--) { for(j=200;j>0;j--) ; } } void main(void) { unsigned char i=0; init_devices(); while(1) { for(i=255;i>0;i--) { SPI_MasterTransmit(i); Delay(); } } }
 
 
 

回复

1170

帖子

0

TA的资源

至上芯片

6
 

回复: 今天搞了AVR的TWI主从机通讯,专门写了一个简单的易于新手看懂的例子程序

从机程序 //ICC-AVR application builder : 2007-7-18 12:56:10 // Target : M16 // Crystal: 7.3728Mhz // 作者:古欣 // AVR与虚拟仪器 http://www.avrvi.com // 功能:从机模式,中断方式接收,并在LED上显示 #include <iom16v.h> #include <macros.h> void port_init(void) { PORTA = 0x00; DDRA = 0xFF; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //SPI initialize // clock rate: 57599hz void spi_init(void) { SPCR = 0xE3; //setup SPI SPSR = 0x00; //setup SPI } #pragma interrupt_handler spi_stc_isr:11 void spi_stc_isr(void) { //byte in SPDR has been sent/received PORTA = SPDR; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); spi_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void main(void) { init_devices(); DDRB|=(1<<PB6); //MOSI 设置为输出 while(1) ;//等待中断 }
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 

haodongxi

xiexie fenxiang
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

8
 

Re: 今天搞了AVR的TWI主从机通讯,专门写了一个简单的易于新手看懂的例子程序

如何才能得到新币

赞赏

1

查看全部赞赏

 
 
 

回复

82

帖子

0

TA的资源

纯净的硅(高级)

9
 

Re: 今天搞了AVR的TWI主从机通讯,专门写了一个简单的易于新手看懂的例子程序

呵呵~没弄太明白~呵呵
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 

??????

头文件了???????
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 

好东西

好东西
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

12
 

回复 6楼 呱呱 的帖子

楼主,看了你写的这个程序[simple_twitest.rar]
里面的#define TWI_MOD 0 为什么可以设置AVR单片机作为从机?
当#define TWI_MOD 1 时设置成主机。能说明下情况嘛?
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

13
 

回复 楼主 呱呱 的帖子

请问下楼主,你写的程序里,这里为什么要写两次数据啊(TWDR)?
case TW_ST_ARB_LOST_SLA_ACK:// 0xB0: SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收,ACK 已返回
      // 被选中为从读出 (数据将从传回主机)
          TWDR=main_tmp;  //发送全局变量中值
          Twi_Ack();                
          break;   
  case TW_ST_DATA_ACK:            // 0xB8: TWDR 里数据已经发送,接收到ACK
      //发送数据位
         TWDR=main_tmp;
     break;
 
 
 

回复

187

帖子

0

TA的资源

一粒金砂(中级)

14
 
不错,看看
 
个人签名油画|http://www.chndafen.com
 
 

回复

17

帖子

0

TA的资源

一粒金砂(初级)

15
 
谢谢楼主,我想看的是TWI双机通信
 
 
 

回复

31

帖子

0

TA的资源

一粒金砂(初级)

16
 
看看学习学习,如果是可以双MCU通信就好了
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

17
 

看看看。。。。。。。。。。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表