关于武汉芯景科技有限公司的带中断及复位功能2选1IIC主选择芯片XJ9541开发指南(兼容PCA9541)

一、芯片引脚介绍

1.芯片引脚

2.引脚描述

二、典型应用电路

三、功能描述

1.Register 0

2.Register 1

3.Register 2

四、程序代码

        此处只展示master0的代码,master1也可以直接套用此代码

XJ9541master0.CPP

#include "Arduino.h"
#include <Wire.h>
#include "iic.hpp"
#include "XJ9541_master0.hpp"


/***
功能:两个主机获取总线的控制权
输入:无
返回:无
*****/
void Control_bus(void)
{
  uint8_t control_data;
  uint8_t NMYBUS;
  uint8_t MYBUS;

  control_data=ReadOneByte(XJ9541_CONTROL);
  MYBUS=(control_data&(0X01))>>0;//得到NMYBUS位的值
  NMYBUS=(control_data&(0X02))>>1;//得到NMYBUS位的值

  if(MYBUS==NMYBUS)
  {
    Serial.println("The master reading this combination has control of the bus.");
  }
  else
  {
     if( NMYBUS==0)
     {
        //NMYBUS为0,MYBUS为1,将MYBUS置0,获得总线控制权
        WriteOneByte(XJ9541_CONTROL,control_data&0xFE);
     }
     else
     {
        //NMYBUS为1,MYBUS为0,将MYBUS置1,获得总线控制权
        WriteOneByte(XJ9541_CONTROL,control_data|0x01);
     }
  }
}



/***
功能:连接上游通道和下游通道
输入:无
返回:无
*****/
void Slave_channel(void)
{
  uint8_t control_data;
  uint8_t NBUSON;
  uint8_t BUSON;

  control_data=ReadOneByte(XJ9541_CONTROL);

  BUSON=(control_data&(0X04))>>2;//得到NMYBUS位的值
  NBUSON=(control_data&(0X08))>>3;//得到NMYBUS位的值

  if(BUSON!=NBUSON)
  {
    Serial.println("Slave channel is on ");
  }
  else
  {
     if( NBUSON==0)
     {
        //NBUSON为0,BUSON为0,将BUSONS置1,连接上游通道和下游通道
        WriteOneByte(XJ9541_CONTROL,control_data|0x04);
     }
     else
     {
        //NBUSON为1,BUSON为1,将BUSONS置0,连接上游通道和下游通道
        WriteOneByte(XJ9541_CONTROL,control_data&0x0B);
     }
  }
}


/***
功能:获取总线的控制权并且连接下游通道
输入:无
返回:无
*****/
void BUS_Connect(void)
{
  Control_bus();
  Slave_channel();
}



/***
功能:检测总线控制权和下游通道是否连接
输入:无
返回:无
*****/
void Monitor_BUS (void)
{
  uint8_t control_data;
  uint8_t NMYBUS;
  uint8_t MYBUS;

  control_data=ReadOneByte(XJ9541_CONTROL);
  MYBUS=(control_data&(0X01))>>0;//得到NMYBUS位的值
  NMYBUS=(control_data&(0X02))>>1;//得到NMYBUS位的值
  if(MYBUS==NMYBUS)
  {
    Serial.println("The master reading this combination has control of the bus.");
  }
  else
  {
    Serial.println("The master reading this combination has not control of the bus.");
  }

  uint8_t NBUSON;
  uint8_t BUSON;
  control_data=ReadOneByte(XJ9541_CONTROL);
  BUSON=(control_data&(0X04))>>2;//得到NMYBUS位的值
  NBUSON=(control_data&(0X08))>>3;//得到NMYBUS位的值
  if(BUSON!=NBUSON)
  {
    Serial.println("Slave channel is on ");
  }
  else
  {
    Serial.println("Slave channel is off ");
  }
}



/***
功能:总线请求初始化
输入:无
返回:无
*****/
void Bus_Init(uint8_t BUSINIT)
{
  uint8_t control_data;

  if(BUSINIT==1)
  {
    control_data=ReadOneByte(XJ9541_CONTROL);
    WriteOneByte(XJ9541_CONTROL,control_data|0x10);
  }
  else
  {
    control_data=ReadOneByte(XJ9541_CONTROL);
    WriteOneByte(XJ9541_CONTROL,control_data&0xEF);
  }

}




/***
功能:让自身的主机产生中断或者清除中断
输入:
      RESET 清除中断
      SET   产生中断 
返回:无
*****/
void Control_self_INT (uint8_t control)
{
  uint8_t control_data;
  if(control==1)
  {
    control_data=ReadOneByte(XJ9541_CONTROL);
    WriteOneByte(XJ9541_CONTROL,control_data|0x40);
  }
  else
  {
    control_data=ReadOneByte(XJ9541_CONTROL);
    WriteOneByte(XJ9541_CONTROL,control_data&0xBF);
  }
}




/***
功能:让其他通道产生中断或者清除中断
输入:
      RESET 清除中断
      SET   产生中断 
返回:无
*****/
void Control_other_INT (uint8_t control)
{
  uint8_t control_data;
  if(control==1)
  {
    control_data=ReadOneByte(XJ9541_CONTROL);
    WriteOneByte(XJ9541_CONTROL,control_data|0x80);
  }
  else
  {
    control_data=ReadOneByte(XJ9541_CONTROL);
    WriteOneByte(XJ9541_CONTROL,control_data&0x7F);
  }
}


/***
功能:让其他通道在断开连接时产生中断,或者不产生中断(中断在断开连接的主机上产生)
输入:
      RESET 不产生中断
      SET   产生中断       
返回:无
*****/
void Other_disconnect_INT (uint8_t BUSLOSTMSK)
{
  uint8_t Interrupt_data;
  if(BUSLOSTMSK==1)
  {
    Interrupt_data=ReadOneByte(XJ9541_IE);
    WriteOneByte(XJ9541_IE,Interrupt_data|0x08);
  }
  else
  {
    Interrupt_data=ReadOneByte(XJ9541_IE);
    WriteOneByte(XJ9541_IE,Interrupt_data&0xF7);
  }

}




/***
功能:在总线请求连接,总线未空闲,产生中断,或者不产生中断
输入:
      RESET 不产生中断
      SET   产生中断       
返回:无
*****/
void connectANDnonidle_INT (uint8_t BUSOKMSK)
{
  uint8_t Interrupt_data;
  if(BUSOKMSK==1)
  {
    Interrupt_data=ReadOneByte(XJ9541_IE);
    WriteOneByte(XJ9541_IE,Interrupt_data|0x04);
  }
  else
  {
    Interrupt_data=ReadOneByte(XJ9541_IE);
    WriteOneByte(XJ9541_IE,Interrupt_data&0xFB);
  }
}




/***
功能:在总线请求连接,并且请求初始化后,产生中断,或者不产生中断
输入:
      RESET 不产生中断
      SET   产生中断       
返回:无
*****/
void connectANDinit_INT (uint8_t  BUSINITMSK)
{
  uint8_t Interrupt_data;
  if( BUSINITMSK==1)
  {
    Interrupt_data=ReadOneByte(XJ9541_IE);
    WriteOneByte(XJ9541_IE,Interrupt_data|0x02);
  }
  else
  {
    Interrupt_data=ReadOneByte(XJ9541_IE);
    WriteOneByte(XJ9541_IE,Interrupt_data&0xFD);
  }
}



/***
功能:在INT_IN电平变化时,产生中断,或者不产生中断
输入:
      RESET 不产生中断
      SET   产生中断       
返回:无
*****/
void INT_IN_INT (uint8_t  INTINMSK)
{
  uint8_t Interrupt_data;
  if( INTINMSK==1)
  {
    Interrupt_data=ReadOneByte(XJ9541_IE);
    WriteOneByte(XJ9541_IE,Interrupt_data|0x01);
  }
  else
  {
    Interrupt_data=ReadOneByte(XJ9541_IE);
    WriteOneByte(XJ9541_IE,Interrupt_data&0xFE);
  }
}



/***
功能:判断是否有中断产生 ,由于来自其他主机的TESTON位而产生的中断
输入:无        
返回:
      1 产生中断
      0 没有产生中断
*****/
uint8_t NMYTEST_flag (void)
{
  uint8_t NMYTEST;
  NMYTEST=ReadOneByte(XJ9541_ISTAT);
  NMYTEST=(NMYTEST&0x80)>>7;
  return NMYTEST;
}


/***
功能:判断是否有中断产生 ,由于来自自身主机的TESTON位而产生的中断
输入:无        
返回:
      1 产生中断
      0 没有产生中断
*****/
uint8_t MYTEST_flag (void)
{
  uint8_t MYTEST;
  MYTEST=ReadOneByte(XJ9541_ISTAT);
  MYTEST=(MYTEST&0x40)>>6;
  return MYTEST;
}


/***
功能:判断是否有中断产生 ,切换到新主机时,向上一个主机生成的中断
输入:无        
返回:
      1 产生中断
      0 没有产生中断
*****/
uint8_t BUSLOST_flag (void)
{
  uint8_t BUSLOST;
  BUSLOST=ReadOneByte(XJ9541_ISTAT);
  BUSLOST=(BUSLOST&0x08)>>3;
  return BUSLOST;
}



/***
功能:判断是否有中断产生 ,总线传感器功能产生的中断(总线时被屏蔽
      请求恢复/初始化)-切换时总线未空闲,本主机生成的中断
输入:无        
返回:
      1 产生中断
      0 没有产生中断
*****/
uint8_t BUSOK_flag (void)
{
  uint8_t BUSOK;
  BUSOK=ReadOneByte(XJ9541_ISTAT);
  BUSOK=(BUSOK&0x04)>>2;
  return BUSOK;
}



/***
功能:判断是否有中断产生 ,总线初始化完成后,生成的中断,读取后中断将会被清除
输入:无        
返回:
      1 产生中断
      0 没有产生中断
*****/
uint8_t BUSINIT_flag (void)
{
  uint8_t BUSINIT;
  BUSINIT=ReadOneByte(XJ9541_ISTAT);
  BUSINIT=(BUSINIT&0x02)>>1;
  return BUSINIT;
}





XJ9541master0.HPP

#ifndef __XJ9541_master0_HPP
#define __XJ9541_master0_HPP

#include "Arduino.h"
#include "iic.hpp"
#include <Wire.h>

#define RESET      0
#define SET        1

#define DISABLE      0
#define ENABLE        1

#define XJ9541_IE        0x00
#define XJ9541_CONTROL        0x01
#define XJ9541_ISTAT        0x02

//控制寄存器
void BUS_Connect(void);
void Control_bus(void);
void Slave_channel(void);
void Monitor_BUS (void);
void Bus_Init(uint8_t BUSINIT);
void Control_self_INT (uint8_t control);
void Control_other_INT (uint8_t control);

//中断使能寄存器
void Other_disconnect_INT (uint8_t BUSLOSTMSK);
void connectANDinit_INT (uint8_t  BUSINITMSK);
void connectANDnonidle_INT (uint8_t BUSOKMSK);
void INT_IN_INT (uint8_t  INTINMSK);


//中断状态寄存器
uint8_t NMYTEST_flag (void);
uint8_t MYTEST_flag (void);
uint8_t BUSLOST_flag (void);
uint8_t BUSINIT_flag (void);
uint8_t BUSOK_flag (void);

#endif

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值