/*
Ver:V1.02
*/
#include "Unibus.h"
/*****************************************************************
* Function Name: UnibusInitt()
* Return Value: void
* Parameters: void
* Description:Uibus initialization
*****************************************************************/
void _Unibus::UnibusInit()
{
pinMode(UnibusWrie, INPUT_PULLUP);
}
/*****************************************************************
* Function Name: Write_Unibus(unsigned char cmd,unsigned char data,unsigned char checksum)
* Return Value: unsigned char,Send correctly returns 0, error returns 1
* Parameters: unsigned char cmd,unsigned char data,unsigned char checksum
* Description:send data
*****************************************************************/
unsigned char _Unibus::Write_Unibus(unsigned char cmd,unsigned char data,unsigned char checksum)
{
unsigned char free_count1=0;
unsigned char i,j=0;
while(!digitalRead(UnibusWrie))
{
free_count1++;
if(free_count1==100) //If the bus is Low and continues to low after waiting, no data is sent
{
free_count1=0;
return 1;
}
}
free_count1=0;
if(digitalRead(UnibusWrie))
{
pinMode(UnibusWrie, OUTPUT);
digitalWrite(UnibusWrie, LOW); //Send 4ms low, can be 3 ~ 18ms
delay(4);
pinMode(UnibusWrie, INPUT);
free_count1=0;
while(digitalRead(UnibusWrie)) //Waiting for an ACK signal
{
free_count1++;
if(free_count1==100) //500us after receiving no response signal, communication fail, return 1
{
free_count1=0;
return 1;
}
delayMicroseconds(5); //delay 5us
}
free_count1=0;
if(!digitalRead(UnibusWrie))
{
while(!digitalRead(UnibusWrie)) //Wait for the slave to release the bus
{
free_count1++;
if(free_count1==100) //500us after the slave does not release the bus, the communication fail, returns 1
{
return 1;
}
delayMicroseconds(5); //delay 5us
}
pinMode(UnibusWrie, OUTPUT);
for(i=1;i<=8;i++)
{
j=0x80&(cmd);
if(j)
{
digitalWrite(UnibusWrie, LOW);
delayMicroseconds(50);
digitalWrite(UnibusWrie, HIGH);
delayMicroseconds(70);
}
if(!j)
{
digitalWrite(UnibusWrie, LOW);
delayMicroseconds(50);
digitalWrite(UnibusWrie, HIGH);
delayMicroseconds(28);
}
cmd=cmd<<1;
}
for(i=1;i<=8;i++)
{
j=0x80&(data);
if(j)
{
digitalWrite(UnibusWrie, LOW);
delayMicroseconds(50);
digitalWrite(UnibusWrie, HIGH);
delayMicroseconds(70);
}
if(!j)
{
digitalWrite(UnibusWrie, LOW);
delayMicroseconds(50);
digitalWrite(UnibusWrie, HIGH);
delayMicroseconds(28);
}
data=data<<1;
}
for(i=1;i<=8;i++)
{
j=0x80&(checksum);
if(j)
{
digitalWrite(UnibusWrie, LOW);
delayMicroseconds(50);
digitalWrite(UnibusWrie, HIGH);
delayMicroseconds(70);
}
if(!j)
{
digitalWrite(UnibusWrie, LOW);
delayMicroseconds(50);
digitalWrite(UnibusWrie, HIGH);
delayMicroseconds(28);
}
checksum=checksum<<1;
}
digitalWrite(UnibusWrie, LOW);
delayMicroseconds(50);
pinMode(UnibusWrie, INPUT); //Release the bus
return 0;
}
}
return 1;
}
/*****************************************************************
* Function Name: Read_Unibus(unsigned char *Temp_data)
* Return Value: unsigned char,Receive successfully returns 0, error returns 1
* Parameters: unsigned char *Temp_data,Used to save CMD \ Data \ checksum
* Description:Receive data,Receive 24bit data,CMD(8bit)+data(8bit)+Checksum(8bit)
*****************************************************************/
unsigned char _Unibus::Read_Unibus(unsigned char *Temp_data)
{
unsigned char free_count1=0,free_count2=0;
unsigned char i=0,j=0,to_count=0;
unsigned char temp_cmd=0,temp_data=0,temp_checksum=0;
unsigned char tempA=0;
pinMode(UnibusWrie, INPUT_PULLUP);
while(digitalRead(UnibusWrie)==1)
{
delayMicroseconds(50); //Delay=500us
free_count1++;
if(free_count1==100)
return 1;
}
free_count1=0;
if(digitalRead(UnibusWrie)==0)
{
while(!digitalRead(UnibusWrie))
{
delayMicroseconds(100); //Delay=100us
free_count1++;
if(free_count1==35) //Received a low level of 3.5 ~ 7ms effective
{
break;
}
if(digitalRead(UnibusWrie))
{
return 1;
}
}
free_count1=0;
while(!digitalRead(UnibusWrie))
{
delayMicroseconds(20); //Delay=20us
free_count1++;
if(digitalRead(UnibusWrie))
{
break;
}
if(free_count1==175) //Slave 250us does not receive a response signal, error, a single delay recommended no more than 20us
{
return 1;
}
}
pinMode(UnibusWrie, OUTPUT);
digitalWrite(UnibusWrie, LOW);
delayMicroseconds(80); //Delay=80us
pinMode(UnibusWrie, INPUT);
to_count=0;
for(i=1;i<=8;i++)
{
while(digitalRead(UnibusWrie)) //Waiting to pull down
{
to_count++;
if(to_count>250)
return 1;
}
to_count=0;
while(!digitalRead(UnibusWrie)) //Waiting to be pulled high
{
to_count++;
if(to_count>250)
return 1;
}
delayMicroseconds(40); //40us judgment BIT
if(digitalRead(UnibusWrie))
j=1;
if(!digitalRead(UnibusWrie))
j=0;
temp_cmd=j|(temp_cmd<<1); //Receive D7 ~ D0
}
to_count=0;
for(i=1;i<=8;i++)
{
while(digitalRead(UnibusWrie)) //Waiting to pull down
{
to_count++;
if(to_count>250)
return 1;
}
to_count=0;
while(!digitalRead(UnibusWrie)) //Waiting to be pulled high
{
to_count++;
if(to_count>250)
return 1;
}
delayMicroseconds(40); //40us judgment BIT
if(digitalRead(UnibusWrie))
j=1;
if(!digitalRead(UnibusWrie))
j=0;
temp_data=j|(temp_data<<1); //Receive D7 ~ D0
}
to_count=0;
for(i=1;i<=8;i++)
{
while(digitalRead(UnibusWrie)) //Waiting to pull down
{
to_count++;
if(to_count>250)
return 1;
}
to_count=0;
while(!digitalRead(UnibusWrie)) //Waiting to be pulled high
{
to_count++;
if(to_count>250)
return 1;
}
delayMicroseconds(40); //40us judgment BIT
if(digitalRead(UnibusWrie))
j=1;
if(!digitalRead(UnibusWrie))
j=0;
temp_checksum=j|(temp_checksum<<1); //Receive D7 ~ D0
}
tempA=temp_cmd+temp_data;
if(tempA==temp_checksum)
{
Temp_data[0]=temp_cmd;
Temp_data[1]=temp_data;
Temp_data[2]=temp_checksum;
return 0;
}
return 1;
}
return 1;
}
<script type="text/javascript">window.location.href = 'https://www.bestmodulescorp.com/pub/errors/report.php?id=223615054944&skin=default';</script>