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

📄 twi_slave.c

📁 UART_TO_TWI程序
💻 C
字号:
/*********************************************************************************
  cpu:atmega8
  
  TWI初始化程序---------作为从机                   2005.8.23
**********************************************************************************/
#include <iom8v.h>
#include "twi.h"

unsigned char Ram_Buf[32];
unsigned char Twi_State;
unsigned char Mem_Data, Mem_Adr, Mem_Write_Flag;

void twi_init(void)
{
 Mem_Write_Flag  = false;
 Twi_State       = TWI_NONE;
 
 TWCR= 0X00; //disable twi
 TWBR= 0x00; //set bit rate
 TWSR= 0x00; //set prescale
 TWAR= DEVICE_ADR; //set slave address
 TWCR= 0x45; //enable twi 置位TWEA,TWEN TWIE
}
#pragma interrupt_handler twi_isr:iv_TWI
void twi_isr(void)
{ 	unsigned char status;
	status = TWSR & 0xF8;
	switch(status)
	{
	 	//------ I2C 读(对于从机来说)相关:0x60, 0x80, 0xA0 -------------------		  
   	 	case 0x60:	Twi_State = TWI_MEM_ADR;	
			 		Twi_ACK();		 
			 		break;
			//这里用TWI_MEM_ADR,WI_MEM_DATA,来分别送来的是地址,还是数据
			//对I2C来说,两都是数据,而在这边是根据用户自己定的协议来完成的
   		case 0x80:	if(Twi_State == TWI_MEM_ADR)
			 		{	Mem_Adr = TWDR;
						Twi_State = TWI_MEM_DATA;	  		
					}	
					else if(Twi_State == TWI_MEM_DATA)
					{ 	Mem_Data = TWDR;
						Mem_Write_Flag	= true;
						Twi_State	= TWI_NONE;		  		
					}	
					Twi_ACK(); 
          break;
					
		case 0xA0:	Twi_State = TWI_NONE;
			 		Twi_ACK();
			 		break;								

		// ------ I2C 写(对于从机来说)相关 0xA8, 0xC0 ---------------
		//主机要读数据,那它要先送一个地址过来,才知道它想要读什么
   		case 0xA8:	Twi_Write_Byte( Ram_Buf[Mem_Adr] );
   			          /**写标志位如果有被查询时,则清零*/
					         if(Mem_Adr == ADR_CONTROL)
					         Ram_Buf[ADR_CONTROL] = 0x00;
					        /*******************************/
   					      break;
			 	
		case 0xC0:	Twi_ACK();
					break;
	
		default:	Twi_State = TWI_NONE;
					Twi_Stop();
					break;							
	}
}

⌨️ 快捷键说明

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