?? mcp2515.c
字號:
#include "44b.h"
#include "..\INC\MCP2515.h"
#include "..\INC\lcd.h"
#include "44blib.h"
#include "audio.h"
/********************** MCP2515 Pin *********************************/
#define MCP2515_CS 0x4 //EXIO2
/********************** MCP2515 指令 *********************************/
#define MCP2515INSTR_RESET 0xC0 //復位指令
#define MCP2515INSTR_READ 0x03 //讀 指令
#define MCP2515INSTR_WRITE 0x02 //寫 指令
#define MCP2515INSTR_RTS 0x80 //發送請求指令
#define MCP2515INSTR_RDSTAT 0xA0 //讀MCP2515狀態指令
#define MCP2515INSTR_BITMDFY 0x05 //位修改
/*********************SIO管腳************************/
#define SPI_SIOCLK 0x8000 //GPC15
#define SPI_SIORxD 0x0800 //GPC11
#define SPI_SIOTxD 0x2000 //GPC13
#define SPI_SIOCLK_non 0x7FFF //CLK置低
#define SPI_SIOTxD_non 0xF7FF //TXD管腳置低
unsigned char err_f[50] = {0};
unsigned char err_count[50] = {0};
int sos[50];
extern unsigned char n_RxBuffer;
unsigned short RX_B[256] = {0};
unsigned char data_len[64] = {0};
extern U8 rxRTR;
extern U8 isExt;
extern unsigned short PLAY_BUF1[8];
extern unsigned short PLAY_BUF2[8];
//延時>100ns
void Delayns(void)
{
// int j;
// j=1;
}
/********************************************************************/
/* SIO 讀寫操作 */
/********************************************************************/
/******************************************/
/*函數名稱:Init_SIO */
/*函數功能: ARM SIO初始化 */
/* SIOTxD->GBF5 */
/* SIORDY->GBF6 */
/* SIORxd->GBF7 */
/* SIOCLK->GBF8 */
/*入口參數: 無 */
/*返回值 : 無 */
/******************************************/
void Init_SIO(void)
{
rPCONF = (rPCONF & 0x3FF)|(3<<10)|(3<<13)|(3<<16)|(3<<19);
//011 011 011 011 00 00 00 00 00
//設置GPF0(IICSCL),GPF1(IICSDA),GPF2(),GPF3(),GPF4() 為輸入模式
//設置GPF5(SIOTXD) 為SIOTxD ,GPF6(IISDO) 為SIORDY, GPF7(SIORXD) 為SIORxD, GPF8(SIOCLK) 為SIOCLK
rPUPF = (rPUPF & 0x1F)|(15<<5); //0 1010 0000
//允許GPF8(SIOCLK),GPF6(IISDO),GPF4,GPF3,GPF2,GPF1,GPF0 接上拉
rSIOCON = 0x21; //0010 0001
//內部時鐘,MSB模式,發送\接收模式,時鐘下降沿接收或者發送,移位操作為自動運行模式,使能SIO中斷
// rINTMSK &= ~(BIT_GLOBAL|BIT_SIO);
rSBRDR = 15; //波特率1Mbps rSBRDR=31 rIVTCNT =15 //波特率分頻器 波特率=MCLK/2/(預分頻值+1)
rIVTCNT = 7; //波特率2Mbps rSBRDR=15 rIVTCNT =7
}
/******************************************/
/*函數名稱:SendSIOData */
/*函數功能: 向 SIOTxD 發送數據 */
/*入口參數: sio_data : 要發送的數據 */
/*返回值 : 無 */
/******************************************/
void SendSIOData(unsigned char sio_data)
{
rI_ISPC |= BIT_SIO; //BIT_SIO = 0x01<<4 = 0x10; 清空掛起的 ISO 中斷
rSIODAT = sio_data;
rSIOCON |= 0x08; //選用外部時鐘做為 SIO 移位時鐘
while(!(rINTPND & BIT_SIO)); //等待數據發送完成,查詢方式
rI_ISPC |= BIT_SIO; //清空掛起的 ISO 中斷
}
/******************************************/
/*函數名稱:ReadSIOData */
/*函數功能: 從 SIORxD 讀取數據 */
/*入口參數: 無 */
/*返回值 : 從 SIO 讀取的數據 */
/******************************************/
unsigned char ReadSIOData()
{
//while(rSIOCON&SIO_START); //等待發送
return rSIODAT;
}
/*****************************************/
/* */
/* sio管腳作為普通IO模擬SPI通信 */
/* */
/*****************************************/
/******************************************/
/*函數名稱:Init_SIO */
/*函數功能: SIO初始化 */
/*入口參數: 無 */
/*返回值 : 無 */
/******************************************/
/*
void Init_SIO(void)
{
rPDATC = 0x8000; //10000 0000 0000 0000
//置位GPC15
rPCONC = (rPCONC & 0x333FFFFF)|(1<<30)|(1<<26); //設置GPC15,GPC13 為輸出模式
rPUPC &= 0x57FF; //允許GPC15,GPC13,GPC12 上拉
}
*/
/******************************************/
/*函數名稱:SendSIOData */
/*函數功能: 從SIO發送數據 */
/*入口參數: sio_data : 要發送的數據 */
/*返回值 : 無 */
/******************************************/
/*I/O模擬SPI
void SendSIOData(unsigned char sio_data)
{
int i;
// int rPDATC_bak;
// int rPDATC_bak_non;
unsigned char SIOSEND_TEMP;
SIOSEND_TEMP=sio_data;
for (i=7;i>=0;i--)
{
rPDATC &= ~SPI_SIOCLK; //SIOCLK->0 SPI_SIOCLK = 0x8000
if (SIOSEND_TEMP&(1<<i))
{
rPDATC |= SPI_SIOTxD; //SPI_SIOTxD = 0x2000 置 SIOTxD 為1;
// Delayns();
} //延時大于180ns
else
{
rPDATC &= ~SPI_SIOTxD; //置 SIOTxD 為0
// Delayns();
}
rPDATC |= SPI_SIOCLK; //SIOCLK->1
// Delayns();
}
// Delay60ns(1);
}
*/
/******************************************/
/*函數名稱:ReadSIOData */
/*函數功能: 從 SIO 讀取數據 */
/*入口參數: 無 */
/*返回值 : 從 SIO 讀取的數據 */
/******************************************/
/*I/O模擬SPI
unsigned char ReadSIOData()
{
int j;
unsigned char SPI_RxDATA;
SPI_RxDATA = 0;
for (j=7;j>=0;j--)
{
rPDATC &= ~SPI_SIOCLK; //SIOCLK->0
// Delayns();
if (rPDATC & SPI_SIORxD)
SPI_RxDATA |= (1<<j);
rPDATC |= SPI_SIOCLK; //SIOCLK->1
// Delayns();
}
return SPI_RxDATA;
}
*/
/********************************************************************/
/* MCP2515 操作 */
/********************************************************************/
/******************************************/
/*函數名稱:MCP2515_Enable */
/*函數功能: 使能MCP2515,讓其開始工作 */
/* MCP2515_nCS->GPB5 */
/*入口參數: 無 */
/*返回值 : 無 */
/******************************************/
void MCP2515_Enable(void)
{
rPDATB = rPDATB & 0xFDF; //1111 1101 1111
//置GPB5 = nCS2510 = 0: 選中MCP2515
Delayns(); //延時>100ns
}
/******************************************/
/*函數名稱:MCP2515_Disable */
/*函數功能: 禁止MCP2515,讓其停止工作 */
/* MCP2515_nCS->GPB5 */
/*入口參數: 無 */
/*返回值 : 無 */
/******************************************/
void MCP2515_Disable(void)
{
// rPDATC &= ~SPI_SIOCLK; //SIOCLK->0 遵循0,0模式時序
rPDATB |= 0x20; //0010 0000 置GPB5 = nCS2510 = 1: 禁止MCP2515
Delayns();
// rPDATC |= SPI_SIOCLK; //SIOCLK->1
/// Delayns(); //延時>100ns
// rPDATC &= ~SPI_SIOCLK; //SIOCLK->0 遵循0,0模式時序
}
/*************************************************/
/*函數名稱:MCP2515_Reset */
/*函數功能: MCP2515復位 */
/*入口參數: 無 */
/*返回值 : 無 */
/*************************************************/
void MCP2515_Reset()
{
MCP2515_Enable(); //MCP2515 Enable
SendSIOData(MCP2515INSTR_RESET); //發送復位指令
MCP2515_Disable(); //MCP2515 Disable
}
/****************************************************************/
/*函數名稱:MCP2515_ReadStatus */
/*函數功能: 讀取MCP2515狀態 */
/*入口參數: 無 */
/*返回值 : 返回CANINTF 寄存器的值(包含各種中斷源的中斷標志位) */
/* 即MCP2515 有關發送和接收功能的狀態 */
/****************************************************************/
unsigned char MCP2515_ReadStatus(void)
{
unsigned char result;
MCP2515_Enable(); //MCP2515 Enable
SendSIOData(MCP2515INSTR_RDSTAT); //發送讀MCP2515狀態指令
SendSIOData(0); //
result = ReadSIOData(); //返回CANINTF 寄存器的值
MCP2515_Disable(); //MCP2515 Disable
return result;
}
/*******************************************************************/
/*函數名稱:MCP2515_Write */
/*函數功能: 發送數據到 MCP2515 的發送寄存器,等待發送 */
/*入口參數: 1.address : 發送寄存器地址 */
/* 2.value : 待發送的數據 */
/* MCP2515 有三個發送寄存器 地址分別是: 0x30,0x40,0x50 */
/*返回值 : 無 */
/*******************************************************************/
void MCP2515_Write (unsigned char address, unsigned char value)
{
MCP2515_Enable(); //MCP2515 Enable
SendSIOData(MCP2515INSTR_WRITE); //發送寫指令
SendSIOData(address); //寫 發送寄存器地址
SendSIOData(value); //寫 要裝入寄存器中的數據
MCP2515_Disable(); //MCP2515 disenable
}
/***********************************************************/
/*函數名稱:MCP2515_Read */
/*函數功能: 讀取MCP2515 接收寄存器的數據 */
/*入口參數: address : 接收寄存器的地址 */
/* MCP2515 有兩個接收寄存器 地址分別是:0x60,0x70 */
/*返回值 : 從MCP2515 接收寄存器中讀取的數據 */
/***********************************************************/
unsigned char MCP2515_Read(unsigned char address)
{
unsigned char result;
MCP2515_Enable(); //MCP2515 Enable
SendSIOData(MCP2515INSTR_READ); //發送讀指令
SendSIOData(address); //發送要讀取的接收寄存器的地址
SendSIOData(0); //移位時鐘
result = ReadSIOData(); //讀取接收寄存器中的數據
MCP2515_Disable(); //MCP2515 Disable
return result;
}
/**********************************************************************/
/*函數名稱:MCP2515_READ_RXBUFF */
/*函數功能: 讀取RX緩沖區命令 */
/*入口參數: :read_rxbuff 各位說明如下: */
/* BIT0:buff0還是buff1; BIT1:是否讀取標識符 */
/*返回值 : 無 */
/**********************************************************************/
void MCP2515_READ_RXBUFF (unsigned char read_rxbuff)
{
switch (read_rxbuff)
{
case 0x00:
// MCP2515_Enable();
SendSIOData(0x92);
// MCP2515_Disable();
break;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -