一、芯片引脚介绍
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