//#include <htc.h>
#include "reg2510.h"
#include <pic.h>
#include <pic1687x.h>
//#include "mid_lcd.h"
#define CS2510 RC2
#define MESSAGE_ID1 0x200
#define RX_Filter0 0x200
#define RX_Filter1 0x000
#define RX_Filter2 0x000
#define RX_Filter3 0
#define RX_Filter4 0
#define RX_Filter5 0
#define RXB0_MASK 0x7ff
#define RXB1_MASK 0x7ff
#define SJW_2510 2
#define PRSEG_2510 1
#define PHSEG1_2510 3
#define PHSEG2_2510 3
#define SPBRG_2510 7 // TQ = (1/16Mhz) * 2(SPBRG+1) , TQ = 1 us if SPBRG = 7
// Bit time = 125K because 8TQ/Bit
#define MODE_NORMAL 0b00000000
#define MODE_LOOPBACK 0b01000000
#define MODE_LISTEN 0b01100000
#define MDOE_CONFIG 0b10000000
#define MODE_SLEEP 0b00100000
unsigned char rxbuff;
//#define NOP( ) ; #asm nop #endasm
typedef unsigned char uchar ;
void IO_Initial( void ) ;
void SPI_Initial( void ) ; // Initial MSSP to SPI & Fosc/64
void ADC_Initial(void) ;
void TMR1_Initial(void) ;
void MCP2510_Initial(uchar,uchar,uchar,uchar,uchar); // Initial MCP2510 to 125K Bps @ 16 MHZ
void BW_2510(uchar,uchar) ; // Write a BYTE to assigned Address of MCP2510
void CMD_2510(uchar) ; // Write a COMMAND BYTE to MCP2510 through SPI
void MODIFY_2510(uchar , uchar , uchar ) ; // Modify specified address of MCP2510
void Delay_RST2510(void) ;
void WrBuf_2510(struct _TXBX_Buffer *);
void RdBuf_2510(struct _RXBX_Buffer *);
uchar BR_2510(uchar) ;
uchar Write_SPI_Byte(uchar) ;
void interrupt ISRs(void) ;
void itoa(unsigned char * , int ) ;
uchar Test_Char ;
bit TMR1_OVERFLOW ;
struct _RXBX_Buffer
{
uchar IS_RTR ;
int RX_ID ;
uchar RX_Len ;
uchar RXBnD0 ;
uchar RX_Data[8] ;
} RXBX_Buffer ;
struct _TXBX_Buffer
{
uchar IS_RTR ;
int TX_ID ;
uchar TX_Len ;
uchar TXBnD0 ;
uchar TX_Data[8] ;
} TXBX_Buffer ;
union
{
struct {
unsigned RX0IF:1 ;
unsigned RX1IF:1 ;
unsigned TX0IF:1 ;
unsigned TX1IF:1 ;
unsigned TX2IF:1 ;
unsigned ERRIF:1 ;
unsigned WAKIF:1 ;
unsigned MERRF:1 ;
} BIT ;
char ALL_Bits ;
} FLAG_CANINTF ;
union
{
struct {
unsigned SIDL :3 ;
unsigned SIDH:8 ;
} BIT ;
char ID_Word ;
} ID_Data ;
union
{
uchar BYTE_Val[2] ;
unsigned WORD_Val ;
} Int2Byte ;
unsigned char OP_Buffer[10] ;
int Test_int ;
void main(void)
{
IO_Initial( ) ;
SPI_Initial( ) ;
ADC_Initial( ) ;
//OpenLCD( ) ;
CMD_2510(CMD_RESET) ;
Delay_RST2510( ) ;
MCP2510_Initial(SJW_2510,PRSEG_2510,PHSEG1_2510,PHSEG2_2510,SPBRG_2510 ) ;
rxbuff=BR_2510(CANSTAT);
//putrsLCD("MSG= D=") ;
//LCD_Set_Cursor(0,1) ;
//putrsLCD("ADC Value =") ;
TMR1_Initial( ) ;
PEIE = 1 ;
GIE = 1 ;
while (1)
{
if ( TMR1_OVERFLOW == 1 )
{
TMR1_OVERFLOW = 0 ; // Clear Timer overflow flag !!
ADGO = 1 ;
while (ADGO) ;
TXBX_Buffer.TX_Data[0] = 0x01 ;
TXBX_Buffer.TX_Data[1] = 0x03 ;
TXBX_Buffer.TX_Data[2] = 0x05 ;
TXBX_Buffer.TX_Data[3] = ADRESH ;
TXBX_Buffer.TX_Data[4] = ADRESL ;
TXBX_Buffer.IS_RTR = 0 ;
TXBX_Buffer.TX_ID = MESSAGE_ID1 ;
TXBX_Buffer.TX_Len = 5 ;
TXBX_Buffer.TXBnD0 = TXB0D0 ;
WrBuf_2510( &TXBX_Buffer );
CMD_2510(CMD_RTS0) ;
//LCD_Set_Cursor(12,1) ;
//putrsLCD(" ") ;
//LCD_Set_Cursor(12,1) ;
Test_int = ADRESH * 256 + ADRESL ;
itoa(OP_Buffer,Test_int ) ;
//putsLCD(OP_Buffer) ;
}
FLAG_CANINTF.ALL_Bits = BR_2510(CANINTF) ;
if (FLAG_CANINTF.BIT.RX0IF)
{
RXBX_Buffer.RXBnD0 = RXB0D0 ;
RdBuf_2510(&RXBX_Buffer ) ;
MODIFY_2510(CANINTF,0b00000001,0b00000000) ;
//LCD_Set_Cursor(12,0) ;
//LCD_Put_HEX(RXBX_Buffer.RX_Data[3]) ;
//LCD_Put_HEX(RXBX_Buffer.RX_Data[4]) ;
Test_int = RXBX_Buffer.RX_Data[3]*256+RXBX_Buffer.RX_Data[4] ;
PORTD = (uchar)(Test_int >> 2) ;
//LCD_Set_Cursor(4,0) ;
Int2Byte.WORD_Val = RXBX_Buffer.RX_ID ;
//LCD_Put_HEX(Int2Byte.BYTE_Val[1]) ;
//LCD_Put_HEX(Int2Byte.BYTE_Val[0]) ;
}
}
}
void IO_Initial( void )
{
PORTC = 0x00 ; // Make all PORTC as INPUT !!
PORTB = 0x00 ;
PORTA = 0x00 ;
PORTD = 0x00 ;
ADCON1=(ADCON1 & 0xF0)|0b00001110; // Set AN0 for analog input
}
void ADC_Initial( void )
{
ADCON1 = 0b11111110 ;
ADCON0 = 0b10000001 ;
// CMCON = 0b00000000 ;
RA0 = 1 ; // RA0 used as Analog Input !!
}
void WrBuf_2510(struct _TXBX_Buffer *TXBn_Buffer)
{
uchar Result , Send_Len ;
int Loop_Var ;
Send_Len = TXBn_Buffer->TX_Len ;
if ( TXBn_Buffer->IS_RTR == 1 )
TXBn_Buffer->TX_Len |= 0b01000000 ; // Set RTR Bit
switch ( TXBn_Buffer->TXBnD0 )
{
case TXB0D0 :
BW_2510(TXB0SIDH,(uchar)((TXBn_Buffer->TX_ID >> 3) & 0b11111111)) ;
BW_2510(TXB0SIDL,(uchar)((TXBn_Buffer->TX_ID << 5) & 0b11100000)) ;
BW_2510(TXB0DLC,TXBn_Buffer->TX_Len) ;
break ;
case TXB1D0 :
BW_2510(TXB1SIDH,(uchar)((TXBn_Buffer->TX_ID >> 3) & 0b11111111)) ;
BW_2510(TXB1SIDL,(uchar)((TXBn_Buffer->TX_ID << 5) & 0b11100000)) ;
BW_2510(TXB1DLC,TXBn_Buffer->TX_Len) ;
break ;
case TXB2D0 :
BW_2510(TXB2SIDH,(uchar)((TXBn_Buffer->TX_ID >> 3) & 0b11111111)) ;
BW_2510(TXB2SIDL,(uchar)((TXBn_Buffer->TX_ID << 5) & 0b11100000)) ;
BW_2510(TXB2DLC,TXBn_Buffer->TX_Len) ;
break ;
}
CS2510 = 0 ;
if ( Send_Len != 0 )
{
Result = Write_SPI_Byte(CMD_WRITE) ;
Result = Write_SPI_Byte(TXBn_Buffer->TXBnD0) ;
for ( Loop_Var = 0 ; Loop_Var < Send_Len ; Loop_Var ++ )
Result = Write_SPI_Byte(TXBn_Buffer->TX_Data[Loop_Var]) ;
}
CS2510 = 1 ;
}
void RdBuf_2510(struct _RXBX_Buffer *RXBn_Buffer)
{
uchar Result ;
uchar Tmp_RXBnCTRL ;
int Loop_Var ;
if ( RXBn_Buffer->RXBnD0 == RXB0D0 )
{
RXBn_Buffer->RX_Len = BR_2510 ( RXB0DLC ) ;
Result = BR_2510( RXB0SIDH ) ;
RXBn_Buffer->RX_ID = (int)Result * 8 ;
Result = BR_2510( RXB0SIDL ) ;
Result >>= 5 ;
Result &= 0b00000111 ;
RXBn_Buffer->RX_ID += Result ;
Tmp_RXBnCTRL = BR_2510(RXB0CTRL) ;
}
else
{
RXBn_Buffer->RX_Len = BR_2510 ( RXB1DLC ) ;
Result = BR_2510( RXB1SIDH ) ;
RXBn_Buffer->RX_ID = (int)Result * 8 ;
Result = BR_2510( RXB1SIDL ) ;
Result >>= 5 ;
Result &= 0b00000111 ;
RXBn_Buffer->RX_ID += Result ;
Tmp_RXBnCTRL = BR_2510(RXB1CTRL) ;
}
if (Tmp_RXBnCTRL & 0b00001000)
RXBn_Buffer->IS_RTR = 1 ;
else
RXBn_Buffer->IS_RTR = 0 ;
RXBn_Buffer->RX_Len &= 0x0f ; // Get the actual Length
if (RXBn_Buffer->IS_RTR == 0)
{
CS2510 = 0 ;
Result = Write_SPI_Byte(CMD_READ) ;
Result = Write_SPI_Byte(RXBn_Buffer->RXBnD0) ;
for ( Loop_Var = 0 ; Loop_Var < RXBn_Buffer->RX_Len ; Loop_Var ++ )
{
Result = Write_SPI_Byte(0xff) ;
RXBn_Buffer->RX_Data[Loop_Var] = Result ;
}
CS2510 = 1 ;
}
}
void SPI_Initial( void )
{
STAT_SMP = 0 ; // Input Data sampled @ middle of data output time
STAT_CKE = 1 ;
SSPCON = 0b00100010 ; // CKP = 0 , Enable Serial Port and use Fosc/64 as SCK !!
TRISC2 = 0 ; // CS of MCP2510
TRISC3 = 0 ; // SCK
TRISC4 = 1 ; // SDI
TRISC5 = 0 ; // SDO
CS2510 = 1 ;
}
void MCP2510_Initial(uchar SJW,uchar PRSEG ,uchar PHSEG1, uchar PHSEG2,uchar SPBRG )
{
uchar Mode_Status ;
uchar Temp_Par ; // Temporary parameter !!
MODIFY_2510(CANCTRL,0b11100000,0b10000000) ;
MODIFY_2510(CANCTRL,0b00000111,0b00000101) ;
Temp_Par = ((SJW - 1) << 6 ) & 0b11000000 ;
Temp_Par |= SPBRG ;
BW_2510(CNF1,Temp_Par) ;
Temp_Par =
picc.zip_USB PICC_can总线_mcplde_picc _picc usb
版权申诉
26 浏览量
2022-09-21
06:39:30
上传
评论
收藏 355KB ZIP 举报
小贝德罗
- 粉丝: 69
- 资源: 1万+
最新资源
- 基于 Java的班级管理系统课程设计
- 深入探索Suno AI:教程、元标签与案例分析.pdf
- 超市会员积分管理系统主要用于实现了企业管理数据统计等
- 基于 Java的班级管理系统
- MyBatis 动态 SQL:灵活而强大的查询构建器.pdf
- com.accordion.prettyo.apk
- 毕业设计:基于SSM的mysql-ssm软件bug管理系统(源码 + 数据库 + 说明文档)
- MTSQL8.0.35windows(64bit)-mysql-installer-community-8.0.35.0
- 人工智能引领音乐创作新时代之Suno AI
- Public-bicycle-usage-forecast-master.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈