?? mcp2515.c
字號:
//Enable clock output
//MCP2515_Write(CLKCTRL, MODE_LOOPBACK | CLK2);//回環模式
MCP2515_Write(CLKCTRL,MODE_NORMAL|CLK1); //配置為標準工作模式,單觸發使能!!!
// Clear, deactivate the three transmit buffers ,包括設置發送緩沖器ID----全部置0
a = TXB0CTRL;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 14; j++)
{
MCP2515_Write(a, 0);
a++;
}
a += 2; // We did not clear CANSTAT or CANCTRL
}
// and the two receive buffers.(not buffer actually)
MCP2515_Write(RXB0CTRL, 0); //接收模式--接收所有報文,使能滾存
MCP2515_Write(RXB1CTRL, 0);
//Open Interrupt
// MCP2515_Write(CANINTE, RX0IE|RX1IE);
}
/*********************************************************************************/
/*函數名稱:canPoll */
/*函數功能: 查詢是否收到數據 */
/*入口參數: 無 */
/*返回值 : 如果沒有收到數據,則返回-1, */
/* 否則,返回收到數據的緩沖區號 */
/* Note: 如果兩個緩沖區都收到數據,則返回第一個緩沖區 */
/*********************************************************************************/
int canPoll(void)
{
// if (MCP2515_Read(EFLG)&0x40) //如果緩存區0溢出,則說明緩存區1已經存在數據
// return 1;
if(MCP2515_ReadStatus() & RX0INT) //CANINTF & 0x01
return 0;
if(MCP2515_ReadStatus() & RX1INT)
return 1;
return -1;
}
/*********************************************************************************/
/*函數名稱:canRead */
/*函數功能: 查詢是否收到CAN數據: */
/*入口參數: 無 */
/*返回值 : 0:沒有收到 */
/* 1:緩沖區0收到數據 */
/* 2:緩沖區1收到數據 */
/* 3:兩個緩沖區都收到數據 */
/*********************************************************************************/
unsigned char MPC2515_CanPoll(void)
{
unsigned char polldata;
polldata = MCP2515_ReadStatus() & 0x03; //CANINTF & 0x03
return polldata;
}
/*********************************************************************************/
/*函數名稱:canRead */
/*函數功能: 查詢是否收到數據 */
/*入口參數: 1: n : 表示是哪個接收緩沖區接收到數據 */
/* 2: *id : 存放數據 ID 地址 */
/* 3: *pdata : 存放數據地址 */
/* 4: *dlc : 數據長度地址 */
/* 5: *rxRTR : 幀類型 擴展幀 非擴展幀 */
/* 6: *isExt : 總線類型 擴展總線 */
/*返回值 : 0 : 讀取接收緩沖器 0 (RXB0)成功 */
/* 1 : 讀取接收緩沖器 1 (RXB0)成功 */
/* 0xFF :讀取數據失敗 */
/*********************************************************************************/
U8 canRead(int n, U32 *id, U8 *pdata, U8 *dlc, U8 *rxRTR, U8 *isExt) //n表示是哪個接收緩沖區接收到數據
{
U8 CAN_byte;
CAN_byte = MCP2515_Read(CANINTF);
if (n==0)
{
if (CAN_byte & RX0INT) //接收緩沖器 0 中有數據
{
*isExt = MCP2515_Read_Can(n+3, rxRTR, id, pdata, dlc); //讀取各數據
MCP2515_WriteBits(CANINTF, ~RX0INT, RX0INT); //清除 RXB0 滿中斷標志
MCP2515_WriteBits(EFLG, 0, EFLG_RX0OVR); //清除溢出標志
}
return 0; //讀取 RXB0 成功,返回 0
}
else if (n ==1 )
{
if (CAN_byte & RX1INT) //接收緩沖器 1 中有數據
{
*isExt=MCP2515_Read_Can(n+4, rxRTR, id, pdata, dlc);
MCP2515_WriteBits(CANINTF, ~RX1INT, RX1INT); // 清除 RXB1 滿中斷標志
MCP2515_WriteBits(EFLG, 0, EFLG_RX0OVR); //清除溢出標志
}
return 1; //讀取 RXB1 成功,返回 1
}
return 0xff; //讀取數據失敗
}
/*********************************************************************************/
/*函數名稱:CAN_RD */
/*函數功能: 讀取從CAN總線上收到的數據 */
/*入口參數:1. *ppdata :接收到的數據的存放地址; */
/* 2. *datalenth : 接收到的數據字節長度的存放地址 */
/* 3. n_rxbuff :收到數據的緩沖區個數 */
/* 如果兩個緩沖器都接收到數據,則一次性全部接收 */
/*返回值 : 無 */
/*********************************************************************************/
void CAN_RD (unsigned char *ppdata, unsigned char *datalenth, unsigned char n_rxbuff)
{
unsigned char CAN_RD_datalenth;
int i;
switch (n_rxbuff)
{
case 0x0: //沒有收到數據
break;
case 0x01: //接收緩沖器 0 收到數據
*datalenth = (MCP2515_Read(0x65) & DLC_MASK); //讀取數據長度
MCP2515_Enable();
MCP2515_READ_RXBUFF(0);
for (i = *datalenth; i>0; i--) //讀取數據
{
SendSIOData(0);
*ppdata = ReadSIOData();
ppdata++;
}
MCP2515_Disable();
MCP2515_WriteBits(CANINTF, ~RX0INT, RX0INT); //清空 RXB0 中斷滿標志
break;
case 0x02: //接收緩沖器 1 收到數據
*datalenth = (MCP2515_Read(0x75) & DLC_MASK); //讀取數據長度
MCP2515_Enable();
MCP2515_READ_RXBUFF(1);
for (i=*datalenth; i>0; i--) //讀取數據
{
SendSIOData(0);
*ppdata=ReadSIOData();
ppdata++;
}
MCP2515_Disable();
MCP2515_WriteBits(CANINTF, ~RX1INT, RX1INT); //清空 RXB1 中斷滿標志
break;
case 0x03: //兩個接收緩沖器 都收到數據
*datalenth = (MCP2515_Read(0x65) & DLC_MASK); //讀取數據長度
MCP2515_Enable();
MCP2515_READ_RXBUFF(0); //先讀 接收緩沖器 0 中的數據
for (i=*datalenth; i>0; i--)
{
SendSIOData(0);
*ppdata=ReadSIOData();
ppdata++;
}
MCP2515_Disable();
MCP2515_WriteBits(CANINTF, ~RX0INT, RX0INT); //清空 RXB0 中斷滿標志
CAN_RD_datalenth = (MCP2515_Read(0x75) & DLC_MASK); //?
MCP2515_Enable();
MCP2515_READ_RXBUFF(1); //再讀 接收緩沖器 1 中的數據
for (i=CAN_RD_datalenth; i>0; i--)
{
SendSIOData(0);
*ppdata = ReadSIOData();
ppdata++;
}
MCP2515_Disable();
MCP2515_WriteBits(CANINTF, ~RX1INT, RX1INT); //清空 RXB1 中斷滿標
*datalenth = *datalenth + CAN_RD_datalenth;
break;
default :
break;
}
}
/*********************************************************************************/
/*函數名稱:CAN_RD_PLAY */
/*函數功能: 讀取從CAN總線上收到的數據,并直接給CODEC芯片(一次傳輸8*16bits) */
/*入口參數:n_rxbuff : 接收緩沖器數 */
/* NOTE : 1.如果收到的數據不足8個字節(只發生在通話結束),用0填充。 */
/* 2.如果兩個緩沖器都接收到數據,則一次性全部接收 */
/*返回值 : 無 */
/*********************************************************************************/
void CAN_RD_PLAY (unsigned char n_rxbuff)
{
unsigned char *Play_databyte;
static unsigned short Play_data[8] = {0};
static int n_databuff = 0;
int i;
int j;
Play_databyte = (unsigned char *)Play_data + n_databuff;
switch (n_rxbuff)
{
case 0x0: //沒有收到數據
break;
case 0x1:
MCP2515_Enable();
MCP2515_READ_RXBUFF(0);
for (i=8; i>0; i--)
{
SendSIOData(0);
*(Play_databyte++) = ReadSIOData();
}
MCP2515_Disable();
n_databuff += 8;
//判斷是否夠一個IISFIF的數據
if (n_databuff == 16)
{
// SIO_Send (0x0a16); //0x0a16 //DAC mute
while (rIISCON & 0x80); //當發送FIFO非空時,等待
for(j=0; j<8; j++)
{
*IISFIF = Play_data[j];
}
n_databuff = 0;
}
// SIO_Send (0x0a1e); //DAC POWERDOWN
break;
case 0x2:
MCP2515_Enable();
MCP2515_READ_RXBUFF(1);
for (i=8; i>0; i--)
{
SendSIOData(0);
*(Play_databyte++)=ReadSIOData();
}
MCP2515_Disable();
n_databuff +=8;
if (n_databuff==16)
{
// SIO_Send (0x0a16); //DAC POWERUP
while (rIISCON & 0x80); //當發送FIFO非空時,等待
for(j=0; j<8; j++)
{
*IISFIF =Play_data[j];
}
n_databuff = 0;
}
// SIO_Send (0x0a1e);
break;
case 0x3:
MCP2515_Enable();
MCP2515_READ_RXBUFF(0);
for (i=8; i>0; i--)
{
SendSIOData(0);
*(Play_databyte++) = ReadSIOData();
}
MCP2515_Disable();
n_databuff += 8;
if (n_databuff==16)
{
// SIO_Send (0x0a16); //DAC POWERUP
while (rIISCON & 0x80); //當發送FIFO非空時,等待
for(j=0; j<8; j++)
{
*IISFIF = Play_data[j];
}
n_databuff = 0;
}
// SIO_Send (0x0a1e);
Play_databyte = (unsigned char *)Play_data + n_databuff;
MCP2515_Enable();
MCP2515_READ_RXBUFF(1);
for (i=8; i>0; i--)
{
SendSIOData(0);
*(Play_databyte++)=ReadSIOData();
}
MCP2515_Disable();
n_databuff +=8;
if (n_databuff==16)
{
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -