AVR I2C(TWI)程序

2020-06-30来源: eefocus关键字:AVR  I2C  TWI

/*********************************************************************           

目    的:   建立I2C操作库

目标系统:   基于AVR单片机                                                 

应用软件:   ICCAVR                                                      

版    本:   Version 1.0                                                           

*********************************************************************/


/*01010101010101010101010101010101010101010101010101010101010101010101

----------------------------------------------------------------------

版本更新记录:


----------------------------------------------------------------------

入口参数说明:


----------------------------------------------------------------------

待定参数说明:


---------------------------------------------------------------------- 

对外变量说明:


----------------------------------------------------------------------

对外程序说明:


----------------------------------------------------------------------

10101010101010101010101010101010101010101010101010101010101010101010*/


#ifndef I2C_H

#define I2C_H


#include "D:ICC_HCmmICC.H"


/* TWSR values (not bits) */

/* Master */

#define I2C_START   0x08

#define I2C_RESTART   0x10


/* Master Transmitter */

#define I2C_MT_SLA_ACK  0x18

#define I2C_MT_SLA_NACK  0x20

#define I2C_MT_DATA_ACK  0x28

#define I2C_MT_DATA_NACK 0x30

#define I2C_MT_ARB_LOST  0x38


/* Master Receiver */

#define I2C_MR_ARB_LOST  0x38

#define I2C_MR_SLA_ACK  0x40

#define I2C_MR_SLA_NACK  0x48

#define I2C_MR_DATA_ACK  0x50

#define I2C_MR_DATA_NACK 0x58


/* Slave Transmitter */

#define I2C_ST_SLA_ACK   0xA8

#define I2C_ST_ARB_LOST_SLA_ACK 0xB0

#define I2C_ST_DATA_ACK   0xB8

#define I2C_ST_DATA_NACK  0xC0

#define I2C_ST_LAST_DATA  0xC8


/* Slave Receiver */

#define I2C_SR_SLA_ACK    0x60

#define I2C_SR_ARB_LOST_SLA_ACK  0x68

#define I2C_SR_GCALL_ACK   0x70

#define I2C_SR_ARB_LOST_GCALL_ACK 0x78

#define I2C_SR_DATA_ACK    0x80

#define I2C_SR_DATA_NACK   0x88

#define I2C_SR_GCALL_DATA_ACK  0x90

#define I2C_SR_GCALL_DATA_NACK  0x98

#define I2C_SR_STOP     0xA0


/* Misc */

#define I2C_NO_INFO   0xF8

#define I2C_BUS_ERROR  0x00


/*

 * The lower 3 bits of TWSR are reserved on the ATmega163.

 * The 2 LSB carry the prescaler bits on the newer ATmegas.

 */

#define I2C_STATUS_MASK (_BV(TWS7)|_BV(TWS6)|_BV(TWS5)|_BV(TWS4)|_BV(TWS3))

#define I2C_STATUS  (TWSR & I2C_STATUS_MASK)


/*

 * R/~W bit in SLA+R/W address field.

 */

#define I2C_READ  1

#define I2C_WRITE  0


#define I2CStart()     (TWCR=(1<#define I2CStop()      (TWCR=(1<#define I2CWaitAck() {while(!(TWCR&(1<#define I2CChkAck()  (TWSR&0xf8)     //check ack

#define I2CSendAck() (TWCR|=(1<#define I2CSendNoAck() (TWCR&=~(1<#define I2CSendByte(x) {TWDR=(x);TWCR=(1<#define I2CRcvNckByte() (TWCR=(1<#define I2CRcvAckByte() (TWCR=(1<


/* For Program */

#define I2C_Stop()  I2CStop()

#define I2C_SendAck() I2CSendAck()

#define I2C_SendNoAck() I2CSendNoAck()

#define I2C_WaitAck() I2CWaitAck()


/* I2C Config */

#define I2C_ERR   0

#define I2C_CRR   1


/*--------------------------------------------------------------------

程序名称:I2C Start

程序功能:

注意事项:

提示说明:

输    入:

返    回:

--------------------------------------------------------------------*/

bool I2C_Start()     

{

 I2CStart();      

 I2CWaitAck();

 if( I2CChkAck()!=I2C_START ) 

  return I2C_ERR;

 return I2C_CRR;

}

/*--------------------------------------------------------------------

程序名称:I2C ReStart

程序功能:

注意事项:

提示说明:

输    入:

返    回:

--------------------------------------------------------------------*/

bool I2C_Restart()     

{

 I2CStart();      

 I2CWaitAck();

 if( I2CChkAck()!=I2C_RESTART ) 

  return I2C_ERR;

 return I2C_CRR;

}

/*--------------------------------------------------------------------

程序名称:I2C(TWI)发送 7位 器件写地址: XXXX XXX0

程序功能:

注意事项:

提示说明:

输    入:

返    回:

--------------------------------------------------------------------*/

bool I2C_SendWrDAdr(uint8 wrDAdr) 

{

 I2CSendByte(wrDAdr);   //设置 器件写地址

 I2CWaitAck();

 if( I2CChkAck()!=I2C_MT_SLA_ACK )  

  return I2C_ERR;

 return I2C_CRR;  

}

/*--------------------------------------------------------------------

程序名称:I2C(TWI)发送 10位 器件写地址: 1111 0XX0, XXXX XXXX

程序功能:

注意事项:

提示说明:兼容 发送 7位 器件写地址: XXXX XXX0

输    入:

返    回:

--------------------------------------------------------------------*/

bool I2C_SendWrDAdr_(uint16 wrDAdr) 

{

 if( wrDAdr&0xF000 == 0xF000 ) //判断是否为 10位 器件地址

  if( I2C_SendWrDAdr( (uint8)wrDAdr>>8 )==I2C_ERR ) //设置 (高位)器件写地址

   return I2C_ERR;

 if( I2C_SendWrDAdr( (uint8)wrDAdr )==I2C_ERR ) //设置 (低位)器件写地址

  return I2C_ERR;

 return I2C_CRR;

}

/*--------------------------------------------------------------------

程序名称:I2C(TWI)发送 7位 器件读地址: XXXX XXX1

程序功能:

注意事项:

提示说明:

输    入:

返    回:

--------------------------------------------------------------------*/

bool I2C_SendRdDAdr(uint8 rdDAdr) 

{

 I2CSendByte(rdDAdr);   //设置 器件读地址

 I2CWaitAck();

 if( I2CChkAck()!=I2C_MR_SLA_ACK )  

  return I2C_ERR;

 return I2C_CRR; 

}

/*--------------------------------------------------------------------

程序名称:I2C(TWI)发送 10位 器件读地址: 1111 0XX0, XXXX XXXX

程序功能:

注意事项:

提示说明:

输    入:

返    回:

--------------------------------------------------------------------*/

bool I2C_SendRdDAdr_(uint8 rdDAdr) 

{

 if( rdDAdr&0xF000 == 0xF000 ) //判断是否为 10位 器件地址

  if( I2C_SendWrDAdr( (uint8)rdDAdr>>8 )==I2C_ERR ) //设置 (高位)器件读地址

   return I2C_ERR;

 if( I2C_SendWrDAdr( (uint8)rdDAdr )==I2C_ERR ) //设置 (低位)器件读地址

  return I2C_ERR;

 return I2C_CRR;

}

/*--------------------------------------------------------------------

程序名称:I2C(TWI)发送数据

程序功能:

注意事项:

提示说明:

输    入:

返    回:

--------------------------------------------------------------------*/

bool I2C_SendDat(uint8 configDat) 

{

 I2CSendByte(configDat);   

 I2CWaitAck();

 if( I2CChkAck()!=I2C_MT_DATA_ACK ) 

  return I2C_ERR;

 return I2C_CRR; 

}

/*--------------------------------------------------------------------

程序名称:I2C(TWI)接收数据且不产生应答

程序功能:

注意事项:

提示说明:

输    入:

返    回:

--------------------------------------------------------------------*/

bool I2C_RcvNAckDat(uint8 *pRdDat) 

{

 I2CRcvNckByte();

 I2CWaitAck();

 if( I2CChkAck()!=I2C_MR_DATA_NACK )

  return I2C_ERR;

 *pRdDat=TWDR;

 return I2C_CRR;

}

/*--------------------------------------------------------------------

程序名称:I2C(TWI)接收数据且产生应答

程序功能:

注意事项:

提示说明:

输    入:

返    回:

--------------------------------------------------------------------*/

bool I2C_RcvAckDat(uint8 *pRdDat) 

{

 I2CRcvAckByte();     

 I2CWaitAck();

 if( I2CChkAck()!=I2C_MR_DATA_ACK )

  return I2C_ERR;

 *pRdDat=TWDR;

 return I2C_CRR;

}

/*--------------------------------------------------------------------

程序名称:I2C(TWI)写器件,写一个数据

程序功能:

注意事项:

提示说明:

输    入:wrDAdr: write device-address 写器件地址

   wordAdr: word address 字地址

   dat: data 数据

返    回:

--------------------------------------------------------------------*/

bool I2C_Write(uint16 wrDAdr,uint8 wordAdr,uint8 dat)

{

 if( I2C_Start()==I2C_ERR )

  return I2C_ERR;


 if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )

  return I2C_ERR;


 if( I2C_SendDat(wordAdr)==I2C_ERR )

  return I2C_ERR;


 if( I2C_SendDat(dat)==I2C_ERR )

  return I2C_ERR;


 I2C_Stop();


 return I2C_CRR;

}

/*--------------------------------------------------------------------

程序名称:I2C(TWI)写器件,写N个数据

程序功能:

注意事项:

提示说明:

输    入:wrDAdr: write device-address 写器件地址

   wordAdr: word address 字地址

   *pWrDat: p->write data 写入数据指针

   num: number 写入数据个数

返    回:

--------------------------------------------------------------------*/

//bool I2C_Write_(uint16 wrDAdr,uint8 wordAdr,

//      uint8 *pWrDat,uint8 num)

//{

//

//} 

/*--------------------------------------------------------------------

程序名称:I2C(TWI)读器件,读一个数据

[1] [2]
关键字:AVR  I2C  TWI 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic501606.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:使用74LS164将AVR的串口输出扩为并口输出
下一篇:AVR 硬件操作库函数

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

[AVR]高压并行编程---基础知识
手一抖就锁了好几片Mega16,这可是几十块钱啊...有必要造一个高压并行编程器了一、接线方式及端口定义RDY/BSY 判忙标志位。(0:设备正忙 1:等待新的命令)OE 输出使能位 低电平有效WR 写脉冲 低电平有效BS[2:1] 字节选择1(0:选择低位字节 1:选择高位字节)XA[1:0] XTAL动作位00加载Flash或者EEPROM地址01加载数据10加载命令11保留PAGEL 加载程序存储器和EEPROM数据页DATA 双向数据/命令口0x80 芯片擦除0x40 写熔丝位0x20 写锁定位0x10 写FLASH0x11 写EEPROM0x08 读标示字节和校准字节0x04 读熔丝位及锁定位0x02 读FLash0x03
发表于 2020-06-06
AVR下载烧写的复杂熔丝设置尿性
为什么AVR16总是下不进程序,我用的是AVR Studio下载的,熔丝位SPIEN变成灰色的了,而且勾不上。提问者采纳    熔丝被你点成外部晶振了,找个信号发生器把1MHZ 5V的信号与16接晶振的任意一脚连接,同时用下载器编辑熔丝,记得点成内部的,如果还是不行把信号电压提高。    熔丝位是ATMEL公司AVR单片机比较独到的特征。在每一种型号的AVR单片机内部都有一些特定含义的熔丝位,其特性表现为多次擦写的E²PROM。用户通过配置(编程)这些熔丝位,可以固定地设置AVR的一些特性,参数以及I/O配置等,当然也包括对片内运行代码的锁定(加密)。   
发表于 2020-06-06
AVR下载烧写的复杂熔丝设置尿性
马潮老师关于正确配置AVR熔丝位的建议
对AVR熔丝位的配置是比较细致的工作,用户往往忽视其重要性,或感到不易掌握。下面给出对AVR熔丝位的配置操作时的一些要点和需要注意的相关事项。有关ATmega128熔丝位的具体定义和功能请查看本书相关章节,在附录中将给出一个完整的汇总表。(1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态,“Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。因此,配置熔丝位的过程实际上是“配置熔丝位成为未编程状态“1”或成为已编程状态“0””。(2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时,请
发表于 2020-06-06
基于AVR的串口与PC机通信代码(uart8位数据)
/************************************AVR时钟:8.00MHz*波特率9600(51)8位数据,1位停止,当波特率设置为19200时,UBRR=25,4800=103*注:波特率设置9600最佳,别的数据不稳定,不同波特率对应的UBRR值参考手册*PC机向开发板发送一个字符,开发板将其大写字母回写给PC机***********************************/#include<iom16v.h>#include<macros.h>void USART_Init( unsigned int baud ){/* 设置波特率,baud的值查数据手册
发表于 2020-06-06
Microchip推出全新功能安全型AVR® DA系列单片机,支持实时控制、连接和HMI应用
随着物联网(IoT)为工业和家庭应用提供更强的连接性,以及车联网提升了驾驶室和操控功能,业界需要更高性能的单片机来实现更好的实时控制以及增强的人机接口应用。Microchip Technology Inc.(美国微芯科技公司)日前宣布推出下一代AVR® DA系列单片机(MCU),是其首款带有外设触摸控制器(PTC)的功能安全型AVR MCU系列。Microchip 8位单片机事业部助理营销副总裁Greg Robinson表示:“新推出的AVR DA单片机系列继承了Microchip高性能和高代码效率器件的优势,通过搭载先进模拟和独立于内核的外设,以及比现有器件更多的电容式触摸通道,满足了多个行业的新需求。新的单片机系列产品广泛应用
发表于 2020-05-07
Microchip推出全新功能安全型AVR® DA系列单片机,支持实时控制、连接和HMI应用
Microchip推出全新功能安全型AVR® DA系列单片机
随着物联网(IoT)为工业和家庭应用提供更强的连接性,以及车联网提升了驾驶室和操控功能,业界需要更高性能的单片机来实现更好的实时控制以及增强的人机接口应用。Microchip Technology Inc.(美国微芯科技公司)今日宣布推出下一代AVR® DA系列单片机(MCU),是其首款带有外设触摸控制器(PTC)的功能安全型AVR MCU系列。 Microchip 8位单片机事业部助理营销副总裁Greg Robinson表示:“新推出的AVR DA单片机系列继承了Microchip高性能和高代码效率器件的优势,通过搭载先进模拟和独立于内核的外设,以及比现有器件更多的电容式触摸通道,满足了多个行业的新需求。新的单片机
发表于 2020-05-06
Microchip推出全新功能安全型AVR® DA系列单片机
何立民专栏 单片机及嵌入式宝典

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

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