用了2个节点,1个节点发送0xaa给节点2,2节点收到发送0x55给一节点,过程中用串口跟踪个寄存器状态!<br /><br />节点1上传给串口的数据:00 01 02 01 01 aa 03 01 a6<br />节点1程序:<br />//======================================================<br />unsigned char xdata *SJA_BasicAddr;<br /><br />unsigned char PC_BUF;<br /><br />sbit LED = P1^6;<br />sbit BEEP = P1^7;<br /><br /><br />#define OK 0<br />#define ERROR 1<br /><br />//======================================================<br /><br /><br /><br /><br />extern bit SJA_TestCommunication(void);<br />extern bit SJA_EnterRestModel(void);<br />extern bit SJA_QuitResetModel(void);<br />extern void SJA_SetInterrupt(unsigned char interruptMode);<br />extern void SJA_SetBaudRate(unsigned char baudRateNum);<br />extern void SJA_SetObject(unsigned char acr, unsigned char amr);<br />extern void SJA_SetOutandClock(unsigned char outControl, unsigned char clockOut);<br />void MCU_Init(void);<br />void Delay(unsigned int Delay_time);<br />bit SJA_Init(void);<br />void send(unsigned char S_Data);<br /><br /><br /><br /> <br />//-------------------------------------------------------------------<br />bit SJA_TestCommunication(void)<br />{<br /> SJA_BasicAddr = REG_TEST;<br /> *SJA_BasicAddr = 0xAA;<br /> <br /> if (*SJA_BasicAddr == 0xAA)<br /> {<br /> return OK;<br /> }<br /> else<br /> {<br /> return ERROR;<br /> }<br /><br />}<br /><br /><br /> <br />//-------------------------------------------------------------------<br /><br />bit SJA_EnterRestModel(void)<br />{<br /> unsigned char temp;<br /> <br /> SJA_BasicAddr = REG_CONTROL;<br /> temp = *SJA_BasicAddr;<br /> *SJA_BasicAddr = temp |RR_CTR; // 置位复位请求位<br /> <br /> if ((*SJA_BasicAddr & RR_CTR) == 1)<br /> {<br /> return OK;<br /> }<br /> else<br /> {<br /> return ERROR;<br /> }<br />}<br /><br /><br /> <br />//-------------------------------------------------------------------<br /> bit SJA_QuitResetModel(void)<br />{<br /> unsigned char temp;<br /><br /> SJA_BasicAddr = REG_CONTROL;<br /> temp = *SJA_BasicAddr;<br /> *SJA_BasicAddr = temp & (~RR_CTR);<br /><br /> if ((*SJA_BasicAddr & RR_CTR) == 1)<br /> {<br /> return ERROR;<br /> }<br /> else<br /> {<br /> return OK;<br /> }<br /><br />}<br /><br /><br /><br /><br />//-------------------------------------------------------------------<br />//参数说明: <br />//返回值: 无 <br />//说明: 该函数用于设定再系统晶体为16MHz时常用的<br />// 标准波特率的值。<br />//-------------------------------------------------------------------<br />unsigned char code SJA_BTR_TABLE[] = {<br />0xbf, 0xff, // 5Kbps时的波特率<br />0x67, 0x2f, // 10Kbps时的波特率<br />0x53, 0x2f, // 20Kbps时的波特率<br />0x87, 0xff, // 40Kbps时的波特率<br />0x47, 0x2f, // 50Kbps时的波特率<br />0x83, 0xff, // 80Kbps时的波特率<br />0x43, 0x2f, // 100Kbps时的波特率<br />0x03, 0x1c, // 125Kbps时的波特率<br />0x81, 0xfa, // 200Kbps时的波特率<br />0x01, 0x1c, // 250Kbps时的波特率<br />0x80, 0xfa, // 400Kbps时的波特率<br />0x00, 0x1c, // 500Kbps时的波特率<br />0x80, 0xb6, // 666Kbps时的波特率<br />0x00, 0x16, // 800Kbps时的波特率<br />0x00, 0x14 // 1000Kbps时的波特率<br />};<br /><br /> void SJA_SetBaudRate(unsigned char baudRateNum)<br />{<br /> unsigned char btr0, btr1;<br /> <br /> btr0 = SJA_BTR_TABLE[2*baudRateNum];<br /> btr1 = SJA_BTR_TABLE[2*baudRateNum+1];<br /><br /> SJA_BasicAddr = REG_BTR0;<br /> *SJA_BasicAddr = btr0;<br /> SJA_BasicAddr = REG_BTR1;<br /> *SJA_BasicAddr = btr1;<br />}<br /><br /><br /> <br />//-------------------------------------------------------------------<br />void SJA_SetObject(unsigned char acr, unsigned char amr)<br /> {<br /> SJA_BasicAddr = REG_ACR;<br /> *SJA_BasicAddr = acr;<br /> SJA_BasicAddr = REG_AMR;<br /> *SJA_BasicAddr = amr;<br /> }<br /><br /><br /> <br />//-------------------------------------------------------------------<br />void SJA_SetOutandClock(unsigned char outControl, unsigned char clockOut)<br /> {<br /> SJA_BasicAddr = REG_OUTCTR;<br /> *SJA_BasicAddr = outControl;<br /><br /> SJA_BasicAddr = REG_CDR;<br /> *SJA_BasicAddr = clockOut;<br /> }<br /><br /><br /><br />//-------------------------------------------------------------------<br />//<br />//-------------------------------------------------------------------<br />bit SJA_Init(void)<br />{<br /> while (SJA_TestCommunication() == ERROR); // 测试连接<br /> while (SJA_EnterRestModel() == ERROR);<br /> SJA_SetBaudRate(6);<br /> SJA_SetObject(0x01, 0xfc);<br /> SJA_SetOutandClock(0xaa, 0x48);<br /> while (SJA_QuitResetModel() == ERROR); <br /><br /> return 0;<br />}<br /><br /><br /><br />//-------------------------------------------------------------------------<br />void MCU_Init(void)<br />{<br /> PC_BUF = 0x77; <br /> TMOD = 0x20;<br /> TH1 = 0xfd;<br /> TL1 = 0xfd;<br /> TR1 = 1;<br /> SCON = 0xd8;<br /> PCON = 0x00;<br /> EA = 1;<br /> ES = 1;<br />}<br /><br /><br /><br />void Send(unsigned char S_Data)<br />{<br /> SBUF = S_Data;<br /> while(TI == 0);<br /> TI =0;<br />}<br /><br /><br /><br />//--------------------------------------------------------------------------<br />void Delay(unsigned int Delay_time)<br />{<br /> unsigned int i;<br /> unsigned char t;<br /><br /> for (i=Delay_time; i>0; i--)<br /> for (t=100; t>0; t--)<br /> {<br /> ;<br /> }<br />}<br /><br /><br /><br /><br /><br />//----------------------------------------------------------------------------------------<br />void main(void)<br />{<br /> unsigned char temp;<br /> <br /> Delay(1000);<br /> MCU_Init();<br /> if (SJA_Init() == 0)<br /> {<br /> send(0x00);<br /> }<br /><br /> LED =0;<br /> BEEP = 0;<br /> Delay(1000);<br /> LED = 1;<br /> BEEP = 1;<br /> send(0x01);<br /><br /><br /> while (1)<br /> {<br /> SJA_BasicAddr = REG_STATUS; //检查发送缓冲区状态<br /> while ((*SJA_BasicAddr & TBS_STA) != TBS_STA);<br /> send(0x02);<br /><br /> SJA_BasicAddr = REG_TxBuffer1;<br /> *SJA_BasicAddr = 0x01;<br /> temp = *SJA_BasicAddr;<br /> send(temp);<br /> SJA_BasicAddr = REG_TxBuffer2;<br /> *SJA_BasicAddr= 0x01;<br /> temp = *SJA_BasicAddr;<br /> send(temp);<br /> SJA_BasicAddr = REG_TxBuffer3;<br /> *SJA_BasicAddr = 0xaa;<br /> temp = *SJA_BasicAddr;<br /> send(temp);<br /><br /> SJA_BasicAddr = REG_COMMAND;<br /> *SJA_BasicAddr = TR_CMD;<br /> temp = *SJA_BasicAddr;<br /> send(0x03);<br /> send(temp);<br /><br /> SJA_BasicAddr = REG_STATUS;<br /> temp = *SJA_BasicAddr;<br /> send(temp);<br /> while ((*SJA_BasicAddr & TCS_STA) != TCS_STA);<br /> temp = *SJA_BasicAddr;<br /> send(0x05);<br /> send (0x04);<br /><br /><br /><br /><br /> SJA_BasicAddr = REG_STATUS;<br /> while ((*SJA_BasicAddr & RBS_STA) != RBS_STA);<br /> send(0x04);<br /> SJA_BasicAddr = REG_RxBuffer1;<br /> temp = *SJA_BasicAddr;<br /> send(temp);<br /> SJA_BasicAddr = REG_RxBuffer2;<br /> temp = *SJA_BasicAddr;<br /> send(temp);<br /> SJA_BasicAddr = REG_RxBuffer3;<br /> temp = *SJA_BasicAddr;<br /> send(temp);<br /><br /><br /> LED =0;<br /> BEEP = 0;<br /> Delay(1000);<br /> LED = 1;<br /> BEEP = 1;<br /><br /> SJA_BasicAddr = REG_COMMAND;<br /> *SJA_BasicAddr = RRB_CMD; <br /><br /> SJA_BasicAddr = REG_STATUS;<br /> while ((*SJA_BasicAddr & RBS_STA) != RBS_STA);<br /> send(0x05);<br /> }<br /><br />节点2上传给串口数据:00 01 d1 03 cf 50 B8 04 05 <br />节点2程序:<br />//======================================================<br />unsigned char xdata *SJA_BasicAddr;<br /><br />unsigned char PC_BUF;<br /><br />sbit LED = P1^6;<br />sbit BEEP = P1^7;<br /><br /><br />#define OK 0<br />#define ERROR 1<br /><br />//======================================================<br /><br /><br /><br /><br />extern bit SJA_TestCommunication(void);<br />extern bit SJA_EnterRestModel(void);<br />extern bit SJA_QuitResetModel(void);<br />extern void SJA_SetInterrupt(unsigned char interruptMode);<br />extern void SJA_SetBaudRate(unsigned char baudRateNum);<br />extern void SJA_SetObject(unsigned char acr, unsigned char amr);<br />extern void SJA_SetOutandClock(unsigned char outControl, unsigned char clockOut);<br />void MCU_Init(void);<br />void Delay(unsigned int Delay_time);<br />bit SJA_Init(void);<br />void send(unsigned char S_Data);<br /><br /><br /><br /> <br />//-------------------------------------------------------------------<br />bit SJA_TestCommunication(void)<br />{<br /> SJA_BasicAddr = REG_TEST;<br /> *SJA_BasicAddr = 0xAA;<br /> <br /> if (*SJA_BasicAddr == 0xAA)<br /> {<br /> return OK;<br /> }<br /> else<br /> {<br /> return ERROR;<br /> }<br /><br />}<br /><br /><br /> <br />//-------------------------------------------------------------------<br /><br />bit SJA_EnterRestModel(void)<br />{<br /> unsigned char temp;<br /> <br /> SJA_BasicAddr = REG_CONTROL;<br /> temp = *SJA_BasicAddr;<br /> *SJA_BasicAddr = temp |RR_CTR; // 置位复位请求位<br /> <br /> if ((*SJA_BasicAddr & RR_CTR) == 1)<br /> {<br /> return OK;<br /> }<br /> else<br /> {<br /> return ERROR;<br /> }<br />}<br /><br /><br /> <br />//-------------------------------------------------------------------<br /> bit SJA_QuitResetModel(void)<br />{<br /> unsigned char temp;<br /><br /> SJA_BasicAddr = REG_CONTROL;<br /> temp = *SJA_BasicAddr;<br /> *SJA_BasicAddr = temp & (~RR_CTR);<br /><br /> if ((*SJA_BasicAddr & RR_CTR) == 1)<br /> {<br /> return ERROR;<br /> }<br /> else<br /> {<br /> return OK;<br /> }<br /><br />}<br /><br /><br /><br /><br />//-------------------------------------------------------------------<br />//参数说明: <br />//返回值: 无 <br />//说明: 该函数用于设定再系统晶体为16MHz时常用的<br />// 标准波特率的值。<br />//-------------------------------------------------------------------<br />unsigned char code SJA_BTR_TABLE[] = {<br />0xbf, 0xff, // 5Kbps时的波特率<br />0x67, 0x2f, // 10Kbps时的波特率<br />0x53, 0x2f, // 20Kbps时的波特率<br />0x87, 0xff, // 40Kbps时的波特率<br />0x47, 0x2f, // 50Kbps时的波特率<br />0x83, 0xff, // 80Kbps时的波特率<br />0x43, 0x2f, // 100Kbps时的波特率<br />0x03, 0x1c, // 125Kbps时的波特率<br />0x81, 0xfa, // 200Kbps时的波特率<br />0x01, 0x1c, // 250Kbps时的波特率<br />0x80, 0xfa, // 400Kbps时的波特率<br />0x00, 0x1c, // 500Kbps时的波特率<br />0x80, 0xb6, // 666Kbps时的波特率<br />0x00, 0x16, // 800Kbps时的波特率<br />0x00, 0x14 // 1000Kbps时的波特率<br />};<br /><br /> void SJA_SetBaudRate(unsigned char baudRateNum)<br />{<br /> unsigned char btr0, btr1;<br /> <br /> btr0 = SJA_BTR_TABLE[2*baudRateNum];<br /> btr1 = SJA_BTR_TABLE[2*baudRateNum+1];<br /><br /> SJA_BasicAddr = REG_BTR0;<br /> *SJA_BasicAddr = btr0;<br /> SJA_BasicAddr = REG_BTR1;<br /> *SJA_BasicAddr = btr1;<br />}<br /><br /><br /> <br />//-------------------------------------------------------------------<br />void SJA_SetObject(unsigned char acr, unsigned char amr)<br /> {<br /> SJA_BasicAddr = REG_ACR;<br /> *SJA_BasicAddr = acr;<br /> SJA_BasicAddr = REG_AMR;<br /> *SJA_BasicAddr = amr;<br /> }<br /><br /> <br />//-------------------------------------------------------------------<br />void SJA_SetOutandClock(unsigned char outControl, unsigned char clockOut)<br /> {<br /> SJA_BasicAddr = REG_OUTCTR;<br /> *SJA_BasicAddr = outControl;<br /><br /> SJA_BasicAddr = REG_CDR;<br /> *SJA_BasicAddr = clockOut;<br /> }<br /><br /><br /><br />//-------------------------------------------------------------------<br />//<br />//-------------------------------------------------------------------<br />bit SJA_Init(void)<br />{<br /> while (SJA_TestCommunication() == ERROR); // 测试连接<br /> while (SJA_EnterRestModel() == ERROR);<br /> SJA_SetBaudRate(6);<br /> SJA_SetObject(0x02, 0xfc);<br /> SJA_SetOutandClock(0xaa, 0x48);<br /> while (SJA_QuitResetModel() == ERROR); <br /><br /> return 0;<br />}<br /><br /><br /><br />//-------------------------------------------------------------------------<br />void MCU_Init(void)<br />{<br /> PC_BUF = 0x77; <br /> TMOD = 0x20;<br /> TH1 = 0xfd;<br /> TL1 = 0xfd;<br /> TR1 = 1;<br /> SCON = 0xd8;<br /> PCON = 0x00;<br /> EA = 1;<br /> ES = 1;<br />}<br /><br /><br /><br />void Send(unsigned char S_Data)<br />{<br /> SBUF = S_Data;<br /> while(TI == 0);<br /> TI =0;<br />}<br /><br /><br /><br /><br />//--------------------------------------------------------------------------<br />void Delay(unsigned int Delay_time)<br />{<br /> unsigned int i;<br /> unsigned char t;<br /><br /> for (i=Delay_time; i>0; i--)<br /> for (t=100; t>0; t--)<br /> {<br /> ;<br /> }<br />}<br /><br /><br /><br />//----------------------------------------------------------------------------------------<br />void main(void)<br />{<br /> unsigned char temp;<br /> <br /> Delay(1000);<br /> MCU_Init();<br /> if (SJA_Init() == 0)<br /> {<br /> send(0x00);<br /> }<br /><br /> LED =0;<br /> BEEP = 0;<br /> Delay(1000);<br /> LED = 1;<br /> BEEP = 1;<br /> send(0x01);<br /><br /><br /> while (1)<br /> {<br /> SJA_BasicAddr = REG_STATUS;<br /> temp = *SJA_BasicAddr;<br /> send(temp);<br /> while ((*SJA_BasicAddr & RBS_STA) != RBS_STA);<br /> send(0x03);<br /><br /> SJA_BasicAddr = REG_RxBuffer1;<br /> temp = *SJA_BasicAddr;<br /> send(temp);<br /> SJA_BasicAddr = REG_RxBuffer2;<br /> temp = *SJA_BasicAddr;<br /> send(temp);<br /> SJA_BasicAddr = REG_RxBuffer3;<br /> temp = *SJA_BasicAddr;<br /> send(temp);<br /><br /><br /> LED =0;<br /> BEEP = 0;<br /> Delay(1000);<br /> LED = 1;<br /> BEEP = 1;<br /><br /> SJA_BasicAddr = REG_COMMAND;<br /> *SJA_BasicAddr = RRB_CMD; <br /> send(0x04);<br /><br /> SJA_BasicAddr = REG_STATUS; <br /> while ((*SJA_BasicAddr & RBS_STA) != RBS_STA);<br /> send(0x05);<br /> <br /><br /><br /> SJA_BasicAddr = REG_STATUS; //检查发送缓冲区状态<br /> while ((*SJA_BasicAddr & TBS_STA) != TBS_STA);<br /> send(0x02);<br /><br /> SJA_BasicAddr = REG_TxBuffer1;<br /> *SJA_BasicAddr = 0x02;<br /> SJA_BasicAddr = REG_TxBuffer2;<br /> *SJA_BasicAddr= 0x01;<br /> SJA_BasicAddr = REG_TxBuffer3;<br /> *SJA_BasicAddr = 0x55;<br /><br /> SJA_BasicAddr = REG_COMMAND;<br /> *SJA_BasicAddr = TR_CMD;<br /><br /> SJA_BasicAddr = REG_STATUS; //等待发送完毕<br /> while ((*SJA_BasicAddr & TCS_STA) != TCS_STA);<br /> send(0x03);<br /><br /><br /><br /> }<br /><br /> <br /><br /> <br />}<br /><br /><br />问题出在那里呢?<br /> |
|