TWI ATMEGA16L 丛机模式

发布者:JoyfulSerenade最新更新时间:2016-08-15 来源: eefocus关键字:TWI  ATMEGA16L  丛机模式 手机看文章 扫描二维码
随时随地手机看文章
#include "main.h"

#define SLAVE_ADDRESS  0x05

#define SCL               0
#define SDA               1
#define TWI_PORT          PORTC
#define TWI_DIR           DDRC

//SLAVE RECEIVE MODE
#define SR_SLA_ACK        0X60//从机接收地址响应
#define SR_SLA_FAIL       0X68//作为主机仲裁失败,自己的ALT+W被接收
#define SR_GCA_ACK        0X70//从机接收广播响应
#define SR_GCA_FAIL       0X78//作为主机仲裁失败,接收到广播地址
#define SR_DATA_ACK       0X80//从机接收数据响应
#define SR_DATA_NACK      0X88//从机接收数据非应答
#define SR_GCA_DATA_ACK   0X90//从机接收广播数据应答
#define SR_GCA_DATA_NACK  0X98//从机接收广播数据非应答
#define SR_STOP_RESTART   0xA0//从机工作时收到STOP或RESTART
//SLAVE SEND MODE
#define ST_SLA_ACK        0XA8//从机发送地址应答
#define ST_SLA_FAIL       0XB0//作为主机仲裁失败,自己的ALT+R被接收
#define ST_DATA_ACK       0XB8//从机发送数据应答
#define ST_DATA_NACK      0XC0//从机发送数据非应答
#define ST_BYTE_ACK       0XC8//数据已发送,接收到ACK

#define ILLEGAL     0x00

#define TWI_ACK()         (TWCR = (1< #define TWI_NOACK()       (TWCR = (1< #define TWI_RESUME()      (TWCR = (1<

//全局变量
//volatile unsigned char transmit_ready = 0;
volatile unsigned char receive_ready = 0;
//局部变量
static unsigned char transmit_leng = 0;
static unsigned char receive_leng = 0;

static struct SR sr_temp;

void IIC_Init(void)
{
    PORTC |= (1<  DDRC &= ~((1<     
 TWCR = 0x00;
 
  TWAR = (SLAVE_ADDRESS<<1)|(0x00);
 TWDR = 0x00;
 TWCR = (1<  
 st.start = 0x5A;
 
    transmit_leng = sizeof(st);
 receive_leng = sizeof(sr);
}

#pragma interrupt_handler TWI_ISR:18
void TWI_ISR(void)
{
    static unsigned char transmit_cnt = 0;
 static unsigned char receive_cnt = 0;
 
 unsigned char *p_st = (unsigned char *)&st;
 unsigned char *p_sr = (unsigned char *)&sr_temp;
 static unsigned char check = 0;    //校验和
 
    SREG &= ~0x80;
  
    if (sleep_mode == POWER_DOWN)
    {
        sys_reset_flag = 1;
    }
 
 switch(TWSR&0xf8) 
 {
     case SR_SLA_ACK:  
  case 68:
      receive_cnt = 0;                            
      TWI_ACK();
   break;
  case SR_DATA_ACK:   
   if (receive_cnt < (receive_leng-1))
   {
       *(p_sr+receive_cnt) = TWDR;
   }
   else if (receive_cnt == (receive_leng-1))
   {
       *(p_sr+receive_cnt) = TWDR;
    receive_ready = 1;
   }
   receive_cnt++;
   TWI_ACK(); 
   break;
        case SR_STOP_RESTART:                              // 0xA0:从机工作时收到STOP或RESTART      
   TWI_ACK();
   break;
   
  case ST_SLA_ACK:                                   // 0XA8:从机发送地址应答
   transmit_cnt = 0;
   TWDR = *(p_st+transmit_cnt);
   check = *(p_st+transmit_cnt);
   transmit_cnt++;
      TWI_ACK(); 
   break; 
  case ST_DATA_ACK:                                  // 0XB8:从机发送数据应答 
      if (transmit_cnt < (transmit_leng-1))
   {
       TWDR = *(p_st+transmit_cnt);
    check += *(p_st+transmit_cnt);    
   }
   else if (transmit_cnt == (transmit_leng-1))
   {
       TWDR = check;   //发送校验和
   }
   transmit_cnt++;
   TWI_ACK();
   break;
  case ST_DATA_NACK:
      //transmit_ready = 1;
   TWI_ACK();
   break; 
  case ILLEGAL:
  case 0xF8:  
   TWI_RESUME();
   break;
 } 
 SREG |= 0x80;
}

关键字:TWI  ATMEGA16L  丛机模式 引用地址:TWI ATMEGA16L 丛机模式

上一篇:ATMEGA16 多通道AD采集
下一篇:AVR 中断优先级

推荐阅读最新更新时间:2024-03-16 15:05

ATMEGA16L实现时间和温度的循环显示程序分享
//ICC-AVR application builder : 2/13 20:52:33 /******************************************************************************* * 版权: * * 单片机: ATMAGE16L * 晶振: 外部8MHz * 编译器: ICC 7.22 * * 文件名: main.c * 作者: 木子工作室 * 版本: 1.0 * 完成日期: * 功能描述: 在12M晶振下,实现时间和温度的循环显示 **************************************************
[单片机]
AVR 单片学习(九)iic总线及TWI模块的使用方法
IIC总线定义与特点 I2C总线的工作原理 AVR的TWI模块的使用方法 AT24C02IIC inter integrated circuit 总线是一种由PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如:电源和系统风扇,可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。 TWI:ATMega 系列单片机内集成两线制串行接口模块,ATmegl文档称为TWI接口事实上TWI与PHILIOS
[单片机]
AVR 单片<font color='red'>机</font>学习(九)iic总线及<font color='red'>TWI</font>模块的使用方法
3个atmega16之间的(TWI互相通信)+(中断形式仿真)
//1号主机: #include avr/signal.h #include avr/io.h #include util/delay.h #include string.h #define uchar unsigned char #define STATUS (TWSR&0xf8) #define SLA_W 0x32 #define SLA_R 0x33 #define SLAVER_ADDRESS 0x32 #define START 0x08 #define RE_START 0x10 #define MT_SLA_WRITE_ACK 0x18 #define MT_SLA_READ_A
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved