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

📄 twi_master_polling.c

📁 AVR单片机的T_TO_TWI通讯方式
💻 C
字号:
#include <iom8v.h>
#include <macros.h>
#include "delay.h"
#include "twi_master_polling.h"

unsigned char Write_Succsee_Flag;
unsigned char Read_Succsee_Flag;

void twi_init(void)
{
 Write_Succsee_Flag = false;
 Read_Succsee_Flag  = false;
 
 TWCR= 0X00; //disable twi
 TWBR= 0x20; //set bit rate
 TWSR= 0x00; //set prescale
 //TWAR= DEVICE_ADR; //set slave address 本身作为主控
 TWCR= 0x44; //enable twi 置位TWEA,TWEN TWIE
}
/******************************************
                I2C总线写一个字节
			    返回0:       写成功
				返回错误状态字:写失败
*******************************************/
unsigned char twi_write_byte(unsigned char device_adr,unsigned char RamAddress,unsigned char Wdata) 
{
	  //I2C启动
	  Start();                      Wait(); //等TWINT置位
	  if(TestAck()!=START)         {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
	  //写I2C从器件地址和写方式
	  Write8Bit(device_adr);        Wait();
	  if(TestAck()!=MT_SLA_ACK)    {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
	  //写RAM地址
	  Write8Bit(RamAddress);        Wait();
	  if(TestAck()!=MT_DATA_ACK)   {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
	  //写数据
	  Write8Bit(Wdata);             Wait();
	  if(TestAck()!=MT_DATA_ACK)   {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK	
	  //I2C停止
	  Stop();
 	  delay_ms(10);//延时等写完
	  Write_Succsee_Flag = true;
	  return Write_Succsee_Flag;
}
/******************************************
               I2C总线读一个字节
			   如果读失败也返回0
*******************************************/
unsigned char twi_read_byte(unsigned char device_adr,unsigned char RamAddress) 
      {
	   unsigned char temp;
	   
	   //I2C启动
	   Start();                      Wait();
	   if (TestAck()!=START)        {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK	   
	   //写I2C从器件地址和写方式
	   Write8Bit(device_adr);        Wait(); 
	   if (TestAck()!=MT_SLA_ACK)   {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK
	   //写RAM地址
	   Write8Bit(RamAddress);        Wait();
	   if (TestAck()!=MT_DATA_ACK)  {Read_Succsee_Flag  = false;Stop();return TestAck();}
	   //I2C重新启动
	   Start();                      Wait();
	   if (TestAck()!=RE_START)     {Read_Succsee_Flag  = false;Stop();return TestAck();}
	   //写I2C从器件地址和读方式
	   Write8Bit(device_adr+1);    	 Wait();
	   if(TestAck()!=MR_SLA_ACK)  	 {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK
	   //启动主I2C读方式,且设为准备响应
	   Twi();                        Wait();
	   if(TestAck()!=MR_DATA_ACK)   {Read_Succsee_Flag  = false;Stop();return TestAck();}//ACK	
	   //读取I2C接收数据
	   temp=TWDR;
	   Read_Succsee_Flag  = true;
       //I2C停止
	   Stop();
	   return temp;
      }

⌨️ 快捷键说明

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