⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twi.c

📁 AVR单片机的TWI C 程序源码
💻 C
字号:
/**
 * @file $RCSfile: TWI.c,v $
 *
 * Copyright (c) 2004 Atmel.
 *
 * Please read file license.txt for copyright notice.
 *
 * @brief This file is an example to use TWI.
 *
 * This file can be parsed by Doxygen for automatic documentation
 * generation.
 * Put here the functional description of this file within the software
 * architecture of your program.
 *
 * @version $Revision: 1.0 $ $Name:  $
 */

/* @section  I N C L U D E S */
#include "reg_C51.h"
char TWI_data;
char rw=0;                       /* 0=write, 1=read */
char slave_adr;
bit b_TWI_busy=0;

/**
 * FUNCTION_PURPOSE:this function setup TWI in master mode and sends data to slave.
 * FUNCTION_INPUTS:void
 * FUNCTION_OUTPUTS:void
 */
void main(void)
{

SSCON |= 0x40;                   /* enable TWI */
EA=1;                            /* interrupt enable */
IEN1 |=0x02;                     /* enable TWI interrupt */

while(1)                         /* end less */
{
if(!b_TWI_busy && ((SSCON&0x10)!=0x10)) /* if the TWI is free */
{
b_TWI_busy=1;                    /* flag busy =1 */
TWI_data=0x55;                   /* data example to send */
slave_adr=0x01;                  /* slave adresse example */
rw=0;                            /* 0=write */
SSDAT = 0x00;                    /* clear buffer before sending data */
SSCON |= 0x20;                   /* TWI start sending */
}

}
}


/**
 * FUNCTION_PURPOSE:TWI interrupt, task witch process the different status of TWI
 * FUNCTION_INPUTS:void
 * FUNCTION_OUTPUTS:void
 */
void it_TWI(void) interrupt 8 using 1
{
switch(SSCS)                     /* TWI status tasking */
   {
      case(0x00):                /* A start condition has been sent */
      {                          /* SLR+R/W are transmitted, ACK bit received */
      b_TWI_busy=0;              /* TWI is free */
      break;
      }
      case(0x08):                /* A start condition has been sent */
      {                          /* SLR+R/W are transmitted, ACK bit received */
      SSCON &= ~0x20;            /* clear start condition */
      SSDAT = (slave_adr<<1)|rw; /* send slave adress and read/write bit */
      SSCON |= 0x04;             /* set AA */
      break;
      }

      case(0x10):                /* A repeated start condition has been sent */
      {                          /* SLR+R/W are transmitted, ACK bit received */
      SSCON &= ~0x20;            /* clear start condition */
      SSDAT = (slave_adr<<1)|rw; /* send slave adress and read/write bit */
      SSCON |= 0x04;             /* set AA */
      break;
      }

      case(0x18):                /* SLR+W was transmitted, ACK bit received */
      {

      SSDAT = TWI_data;          /* Transmit data byte, ACK bit received */
      SSCON |= 0x04;             /* set AA */
      break;
      }

      case(0x20):                /* SLR+W was transmitted, NOT ACK bit received */
      {
      SSCON |= 0x10;             /* Transmit STOP */
      b_TWI_busy=0;              /* TWI is free */
      break;
      }

      case(0x28):                /* DATA was transmitted, ACK bit received */
      {
      SSCON |= 0x10;             /* send STOP */
      b_TWI_busy=0;              /* TWI is free */
      break;
      }

      case(0x30):                /* DATA was transmitted, NOT ACK bit received */
      {
      SSCON |= 0x10;             /* Transmit STOP */
      b_TWI_busy=0;              /* TWI is free */
      break;
      }

      case(0x38):                /* Arbitration lost in SLA+W or DATA.  */
      {
      SSCON |= 0x10;             /* Transmit STOP */
      b_TWI_busy=0;              /* TWI is free */
      break;
      }
   }
SSCON &= ~0x08;                  /* clear flag */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -