?? sja1000.c
字號:
if(overtime_value == 0) //上次發送 超時 , 發送錯誤
{
#ifdef DEBUG //調試用
printf("!!!!!!!!The last CAN send OverTime ERR!!!!!!!!\n");
#endif
temp = read_sja_reg(REG_COMMAND); //讀出命令寄存器狀態
write_sja_reg(REG_COMMAND,(temp | Bit_AT)); //寫命令寄存器,執行中止發送命令
delay_ms(10); //延時,使命令順利執行
error(CAN_SENDOVERTIME_ERR); //轉到錯誤處理,SJA1000 上次發送超時錯誤
}
/*
if((REG_STATUS & Bit_TBS) == 0) //判斷發送緩沖區是否鎖定
{
#ifdef DEBUG //調試用
printf("CAN Send Buffer locked!!!!!!!!\n");
#endif
return -1; //發送緩沖區鎖定 , 返回
}
*/
//寫 SJA1000內部發送緩沖區(13字節)
write_sja_reg(REG_Information,EFF_data_inf); //擴展幀幀頭
write_sja_reg(REG_Buffer1,get_SwitchState()); //柜號和板號(也即 撥碼開關 的值)
write_sja_reg(REG_Buffer2,CAN_SendBuffer.FrameType_append); //通道號
write_sja_reg(REG_Buffer3,CAN_SendBuffer.FrameType_append); //幀類型附加
write_sja_reg(REG_Buffer4,(CAN_SendBuffer.FrameType << 3)); //幀類型
write_sja_reg(REG_Buffer5,CAN_SendBuffer.FrameSignal1); //幀信號1
write_sja_reg(REG_Buffer6,CAN_SendBuffer.FrameSignal2); //幀信號2
write_sja_reg(REG_Buffer7,CAN_SendBuffer.FrameSignal3); //幀信號3
write_sja_reg(REG_Buffer8,CAN_SendBuffer.FrameSignal4); //幀信號4
write_sja_reg(REG_Buffer9,CAN_SendBuffer.FrameSignal5); //幀信號5
write_sja_reg(REG_Buffer10,CAN_SendBuffer.FrameSignal6); //幀信號6
write_sja_reg(REG_Buffer11,CAN_SendBuffer.FrameSignal7); //幀信號7
write_sja_reg(REG_Buffer12,CAN_SendBuffer.FrameSignal8); //幀信號8
//執行 sja1000 發送命令
temp = read_sja_reg(REG_COMMAND);//讀出命令寄存器狀態
write_sja_reg(REG_COMMAND,(temp | Bit_TR)); //寫令寄存器,執行發送命令
return 0;
}
//***************************************************************************************************
//函數原型: INT8S can_data_receive(void) *
//參數說明: 無 *
//返 回 值: 1 ; SJA1000 的 RXFIFO 有有效數據,并接收成功 *
// 0 ; SJA1000 的 RXFIFO 無有效數據 *
// -1 ; SJA1000 出錯 *
//說 明: CAN控制器接收數據,僅限于接收數據,將SJA1000內部接收緩沖器的13個字節的數據, *
// 存入微處理器保存接收數據的緩沖區(13個字節). *
//***************************************************************************************************
INT8S can_data_receive(void)
{
INT8U tempdata;
INT8U symbol_datastate; //sja1000 數據狀態標志
//8.28 注釋
tempdata = read_sja_reg(REG_STATUS); //讀出狀態寄存器值
// tempdata = read_sja_reg(REG_INTERRUPT); //讀出中斷寄存器狀態
//狀態判斷
//8.28 注釋
// if((tempdata & Bit_ES) != 0) //出錯狀態位 有效
// {
// #ifdef DEBUG //調試用
// uart1_printf_ch("!!!!!!!!!!!!CAN Bit_ES in Error state!!!!!!!!!!!!\n\r");
// #endif
//
// error(CAN_COUNTERS_ERR); //轉到錯誤處理,SJA1000 錯誤計數器 超限錯誤
//
// init_sja1000(); //重新初始化SJA1000
//
// return -1; //SJA1000出錯
// }
if((tempdata & Bit_RBS) == 0) //判斷 SJA1000 的 RXFIFO 是否有有效數據
{
// #ifdef DEBUG //調試用
// uart1_printf_ch("------------ CAN RXFIFO NO DATA ------------\n\r");
// #endif
return 0; //沒有,返回0
}
// if((tempdata & Bit_RI) == 0) //判斷 SJA1000 的 RXFIFO 是否有有效數據
// {
//// #ifdef DEBUG //調試用
//// uart1_printf_ch("------------ CAN RXFIFO NO DATA ------------\n\r");
//// #endif
//
// return 0; //沒有,返回0
// }
//判斷是否有 溢出
//8.28 注釋
if((tempdata & Bit_DOS) == Bit_DOS) //判斷 SJA1000 的 RXFIFO 是否溢出
// if((tempdata & Bit_DOI) == Bit_DOI) //判斷 SJA1000 的 RXFIFO 是否溢出(中斷方式)
{
#ifdef DEBUG //調試用
uart1_printf_ch("!!!!!!!!!!!!CAN RXFIFO OVERFLOW_ERR!!!!!!!!!!!!\n\r");
#endif
error(CAN_OVERFLOW_ERR); //轉到錯誤處理,SJA1000接收 RXFIFO 溢出錯誤
//執行 sja1000 清除數據溢出 命令
tempdata = read_sja_reg(REG_COMMAND); //讀出命令寄存器狀態
write_sja_reg(REG_COMMAND,(tempdata | Bit_CDO)); //寫命令寄存器,執行 清除數據溢出 命令
}
//接收數據判斷(本幀數據本機是否應該接收)
tempdata = read_sja_reg(REG_Information);
if(tempdata == EFF_data_inf) //擴展幀幀頭
{
tempdata = read_sja_reg(REG_Buffer1);
if(tempdata == get_SwitchState()) //柜號和板號(也即 撥碼開關 的值)
{
//讀 SJA1000內部接收緩沖區(10字節)
CAN_ReceiveBuffer.FrameType_append = read_sja_reg(REG_Buffer3); //幀類型附加
CAN_ReceiveBuffer.FrameType = ((read_sja_reg(REG_Buffer4)) >> 3); //幀類型
CAN_ReceiveBuffer.FrameSignal1 = read_sja_reg(REG_Buffer5); //幀信號1
CAN_ReceiveBuffer.FrameSignal2 = read_sja_reg(REG_Buffer6); //幀信號2
CAN_ReceiveBuffer.FrameSignal3 = read_sja_reg(REG_Buffer7); //幀信號3
CAN_ReceiveBuffer.FrameSignal4 = read_sja_reg(REG_Buffer8); //幀信號4
CAN_ReceiveBuffer.FrameSignal5 = read_sja_reg(REG_Buffer9); //幀信號5
CAN_ReceiveBuffer.FrameSignal6 = read_sja_reg(REG_Buffer10); //幀信號6
CAN_ReceiveBuffer.FrameSignal7 = read_sja_reg(REG_Buffer11); //幀信號7
CAN_ReceiveBuffer.FrameSignal8 = read_sja_reg(REG_Buffer12); //幀信號8
symbol_datastate = 0; //接收成功
}
else
{
#ifdef DEBUG //調試用
uart1_printf_ch("!!!! CAN data NO send Me !!!!\n\r");
#endif
symbol_datastate = 1; //數據不是發給本機的,不應該接收,也算沒有接收到數據
}
}
else
{
#ifdef DEBUG //調試用
uart1_printf_ch("!!!! NO Extended data frame format !!!!\n\r");
#endif
symbol_datastate = 1; //非擴展幀的數據幀,也不應該接收,也算沒有接收到數據
}
//執行 sja1000 釋放接收緩沖器命令
tempdata = read_sja_reg(REG_COMMAND); //讀出命令寄存器狀態
write_sja_reg(REG_COMMAND,(tempdata | Bit_RRB)); //寫令寄存器,執行釋放接收緩沖器命令
//返回判斷
if(symbol_datastate == 0) //接收到發給本機的有效數據
{
return 1; // 有有效數據
}
else //數據不是發給本機
{
return 0; //沒有有效數據
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -