AVR I2C(TWI)程序

来自丢石头百科
Admin讨论 | 贡献2019年11月19日 (二) 09:22的版本 (文本替换 - 替换“www.waveshare.net”为“{{SERVERNAME}}”)
<tbody></tbody>

/*********************************************************************  微 雪 电 子   WaveShare   <a class="Blue_2_12px_" href="http://wiki.diustou.com/" style="color: rgb(7, 66, 184);">http://www.waveShare.net               目    的:   建立I2C操作库 目标系统:   基于AVR单片机                                                  应用软件:   ICCAVR                                                       版    本:   Version 1.0                                                        圆版时间:   2005-06-25 开发人员:   SEE 说    明:   若用于商业用途,请保留此段文字或注明代码来源   深 圳 市 微 雪 电 子 有 限 公 司 保 留 所 有 的 版 权     

                                                                                                                                          • /

/*01010101010101010101010101010101010101010101010101010101010101010101


版本更新记录:


入口参数说明:


待定参数说明:


 

对外变量说明:


对外程序说明:


10101010101010101010101010101010101010101010101010101010101010101010*/

  1. ifndef I2C_H
  2. define I2C_H
  3. include "D:\ICC_H\CmmICC.H"

/* TWSR values (not bits) */ /* Master */

  1. define I2C_START   0x08
  2. define I2C_RESTART   0x10

/* Master Transmitter */

  1. define I2C_MT_SLA_ACK  0x18
  2. define I2C_MT_SLA_NACK  0x20
  3. define I2C_MT_DATA_ACK  0x28
  4. define I2C_MT_DATA_NACK 0x30
  5. define I2C_MT_ARB_LOST  0x38

/* Master Receiver */

  1. define I2C_MR_ARB_LOST  0x38
  2. define I2C_MR_SLA_ACK  0x40
  3. define I2C_MR_SLA_NACK  0x48
  4. define I2C_MR_DATA_ACK  0x50
  5. define I2C_MR_DATA_NACK 0x58

/* Slave Transmitter */

  1. define I2C_ST_SLA_ACK   0xA8
  2. define I2C_ST_ARB_LOST_SLA_ACK 0xB0
  3. define I2C_ST_DATA_ACK   0xB8
  4. define I2C_ST_DATA_NACK  0xC0
  5. define I2C_ST_LAST_DATA  0xC8

/* Slave Receiver */

  1. define I2C_SR_SLA_ACK    0x60
  2. define I2C_SR_ARB_LOST_SLA_ACK  0x68
  3. define I2C_SR_GCALL_ACK   0x70
  4. define I2C_SR_ARB_LOST_GCALL_ACK 0x78
  5. define I2C_SR_DATA_ACK    0x80
  6. define I2C_SR_DATA_NACK   0x88
  7. define I2C_SR_GCALL_DATA_ACK  0x90
  8. define I2C_SR_GCALL_DATA_NACK  0x98
  9. define I2C_SR_STOP     0xA0

/* Misc */

  1. define I2C_NO_INFO   0xF8
  2. 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.  */

  1. define I2C_STATUS_MASK (_BV(TWS7)|_BV(TWS6)|_BV(TWS5)|_BV(TWS4)|_BV(TWS3))
  2. define I2C_STATUS  (TWSR & I2C_STATUS_MASK)

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

  1. define I2C_READ  1
  2. define I2C_WRITE  0
  3. define I2CStart()     (TWCR=(1<<twint>#define I2CStop()      (TWCR=(1<<twint>#define I2CWaitAck() {while(!(TWCR&(1<<twint>#define I2CChkAck()  (TWSR&0xf8)     //check ack
  4. define I2CSendAck() (TWCR|=(1<<twea>#define I2CSendNoAck() (TWCR&=~(1<<twea>#define I2CSendByte(x) {TWDR=(x);TWCR=(1<<twint>#define I2CRcvNckByte() (TWCR=(1<<twint>#define I2CRcvAckByte() (TWCR=(1<<twint p=""></twint></twint></twint></twea></twea></twint></twint></twint>

/* For Program */

  1. define I2C_Stop()  I2CStop()
  2. define I2C_SendAck() I2CSendAck()
  3. define I2C_SendNoAck() I2CSendNoAck()
  4. define I2C_WaitAck() I2CWaitAck()

/* I2C Config */

  1. define I2C_ERR   0
  2. 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)读器件,读一个数据 程序功能: 注意事项: 提示说明: 输    入:wrDAdr: write device-address 写器件地址    wordAdr: word address 字地址    rdDAdr: read device-address 读器件地址    *pRdDat: p->read data 读取数据指针 返    回:


*/

bool I2C_Read(uint16 wrDAdr,uint8 wordAdr,      uint8 rdDAdr,uint8 *pRdDat) {  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_Restart()==I2C_ERR )   return I2C_ERR;  if( I2C_SendRdDAdr(rdDAdr)==I2C_ERR )   return I2C_ERR;  if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )   return I2C_ERR;  I2C_Stop();  return I2C_CRR; } /*-------------------------------------------------------------------- 程序名称:I2C(TWI)读器件,读N个数据 程序功能: 注意事项: 提示说明: 输    入:wrDAdr: write device-address 写器件地址    wordAdr: word address 字地址    rdDAdr: read device-address 读器件地址    *pRdDat: p->read data 读取数据指针    num: number 读取数据个数 返    回:


*/

bool I2C_Read_(uint16 wrDAdr,uint8 wordAdr,       uint8 rdDAdr,uint8 *pRdDat,uint8 num) {   uint8 i;    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_Restart()==I2C_ERR )   return I2C_ERR;  if( I2C_SendRdDAdr(rdDAdr)==I2C_ERR )   return I2C_ERR;  for(i=0;i<num-1>  if( I2C_RcvAckDat(pRdDat+i)==I2C_ERR )    return I2C_ERR;    if( I2C_RcvNAckDat(pRdDat+i)==I2C_ERR )    return I2C_ERR;</num-1>  I2C_Stop();    return I2C_CRR; }

  1. endif