| ??? 08/21/10 08:23 Modified: 08/21/10 08:24 Read: times |
#178170 - Slave protocol code Responding to: ???'s previous message |
Another thing - you haven't shown us the full protocol-send code. The comment seems to indicate that a protocol message contains multiple bytes that each one requires an acknowledge - but what does the code look like?
The slave protocol code is as shown, and each data byte (being sent to master) requires acknowledge (from master):
/*****************************************************************************/
// ************* SLAVE CARD CODE *************
/*****************************************************************************/
#define MP_START_BIT 0XCF
#define MP_END_BIT 0xCD
#define ACKNOWLEDGE 0xCA
#define DATA_ACK 0xC8
#define RESET_SLAVE_SIGN 0XC7
#define OH_START_BIT 0xB1
unsigned char code END_OF_COMM_ARR[13]=/*Used for identifying unique End Of Comms at Master End*/
{0XA0,0XA1,0XA2,0XA3,0XA4,0XA5,0XA6,0XA7,0XA8,0XA9,0XAA,0XAB};
bit restart;
bit give_ack;
bit give_data_ack;
bit transmit_enable;
bit trans_r;
bit restart;
unsigned char hardware_id;/*0000 ~ 1100 */
unsigned char rec_data;
unsigned char off_hook,temp_off_hook;
void send_data(unsigned char i)
{ // send the data byte to the master
trans_r = 1;
SBUF = i;
while(trans_r);
}
/*
Sending data byte to master, and each data byte requires
acknowledge from master
*/
void send_data_w_ack(unsigned char i)
{
data_ack = 0;
SBUF = i;
while(!data_ack);//Wait till master acknowledge received in SISR.
}
void sendProtocolToMaster(void)
{
if(off_hook != temp_off_hook)
{ //updates the all the current onhook/offhook status of the slave
send_data_w_ack(SP_START_BIT); // start of the protocol
send_data_w_ack(OH_START_BIT); // protocol no
/*
Inorder to avoid conflict with the protocol start, end unique bytes,
we r sending this byte in 2 nibbles format.
*/
send_data_w_ack(off_hook & 0x0f); // sending lower off_hook status
send_data_w_ack((off_hook >> 4) & 0x0f); // sending upper off_hook status
send_data_w_ack(SP_END_BIT); // end of the protocol
temp_off_hook = off_hook; // avoiding repeated sending
}
send_data(END_OF_COMM_ARR[hardware_id]);
transmit_enable = 0;
SM2 = 1;
}
void main (void)
{
/*Initialisation code here*/
/*Card hardware ID generation code here*/
if(!SM2) //CHECKING WHETHER THE SLAVE IS PERMITED TO SEND THE DATA OR NOT
{
if(give_ack) //IF THERE IS A REQUEST FOR ACK
{
give_ack = 0; //CLEAR THE REQUEST
send_data(ACKNOWLEDGE);
}
if(give_data_ack) //IF THERE IS A REQUEST FOR ACK
{
give_data_ack = 0; //CLEAR THE REQUEST
send_data(DATA_ACK);
}
if(transmit_enable)
sendProtocolToMaster();//IF THE SLAVE IS ENABLED IN TRANSMITING MODE SEND ALL PROTOCOLS PENDING TO THE MASTER
}
if(restart)
{
EA = 0;
((void(code*)(void))0x0000)();//Go to location 00 of code
}
}
void SerialISR_Slave(void) interrupt 4 using 3
{
// RECEIVER SECTION
if(RI)
{ // if a character is received
rec_data = SBUF;// read data character sent from master and store it in rec buf
if(RB8) // if received general broadcast address,
{ // Global Message Reception
if(hardware_id == rec_data)
{ // if received correct address,
transmit_enable = 1;
SM2 = 0; // prepare to read data
give_ack = 1; // SEND ACK SIGNAL TO MASTER
}
else
SM2 = 1;// reset serial port for address reception mode
// This message is not acknowledged back to the Master
// since all the slaves would be replying it at the same time
// and the data would therefore be corrupted.
else if(rec_data == RESET_SLAVE_SIGN)/*To restart the slave*/
restart = 1;
else
{// if the addressed slave is not this...
SM2 = 1; // reset serial port for address reception mode
}
RB8 = 0;
}
else if(!SM2) // IF SLAVE IS IN RECEIVING MODE
{ //Private Message data Reception
if(rec_data == DATA_ACK)//If Data Received Is 'Data Acknowledge'...
data_ack = 1;// Set Data Acknowledged Flag
else if(rec_data == MP_END_BIT)
{ //If Data Received Is Slave Portocol End Flag...
/*Process the received data operations*/
give_data_ack = 1;
}
else if(rec_data == MP_START_BIT)
{ //If Data Received Is Slave Protocol Start Byte
/*Prepare to receive the Data bytes from the next reception*/
give_data_ack = 1;
}
else
{ //If Data Bytes Are Being Received...
/*Load the data bytes into the buffers*/
give_data_ack = 1;
}
}
RI = 0;
rec_data = 0;
}
// TRANSMITTER SECTION
if(TI)
{ // TI = 1, means ready to load new character in SBUF
TI = 0; // clear TI flag since we are goling to transmit again
trans_r =0;
}
}
If required, I can post more details about the coding Thanks. |



