📄 16f877与mcp2510程序.txt
字号:
16f877使用SPI 读/写 MCP2510 数据程序
; 使用SPI 读/写 MCP2510 数据
; 16Mhz 877 和MCP2510
; 125K Bps 8位
; >> The 877 receive data from MCP2510 & Send Byte2 to both PORTD & CCPR1L
; >> Byte2 相当于 ADC 用于发送* 100的结果
; >> CCPR1L PWM
list p=16f877
#include <p16f877.inc>
#include <REG2510.inc>
;歌林电子制作实验室www.nbglin.com
;TEL:0574-88464538 email:nbpic@126.com
; Variables used in this program;
UDATA
******************************************************
;**** REF2510.inc
;**** Definition file of MCP2510 registers & COMMANDs
;******************************************************
CMD_WRITE EQU b'00000010'
CMD_READ EQU b'00000011'
CMD_RESET EQU b'11000000'
CMD_STATUS EQU b'10100000'
CMD_MODIFY EQU b'00000101'
CMD_RTS0 EQU b'10000001'
CMD_RTS1 EQU b'10000010'
CMD_RTS2 EQU b'10000100'
;****************************************************
;**** FIRST PORTION : DEFINITION OF CONTROL REGS
;****************************************************
CANSTAT EQU 0x0E
CANCTRL EQU 0x0F
BFPCTRL EQU 0X0C
TXRTSCTRL EQU 0X0D
CNF1 EQU 0x2A
CNF2 EQU 0x29
CNF3 EQU 0x28
CANINTE EQU 0x2B
CANINTF EQU 0x2C
EFLG EQU 0x2D
TEC EQU 0x1C
REC EQU 0x1D
TXB0CTRL EQU 0x30
TXB1CTRL EQU 0x40
TXB2CTRL EQU 0X50
RXB0CTRL EQU 0X60
RXB1CTRL EQU 0X70
;****************************************************
;**** SECOND PORTION : MASK & FILTER REGS
;****************************************************
RXM0SIDH EQU 0X20
RXM0SIDL EQU 0X21
RXM0EID8 EQU 0X22
RXM0EID0 EQU 0X23
RXM1SIDH EQU 0X24
RXM1SIDL EQU 0X25
RXM1EID8 EQU 0X26
RXM1EID0 EQU 0X27
RXF0SIDH EQU 0X00
RXF0SIDL EQU 0X01
RXF0EID8 EQU 0X02
RXF0EID0 EQU 0X03
RXF1SIDH EQU 0X04
RXF1SIDL EQU 0X05
RXF1EID8 EQU 0X06
RXF1EID0 EQU 0X07
RXF2SIDH EQU 0X08
RXF2SIDL EQU 0X09
RXF2EID8 EQU 0X0A
RXF2EID0 EQU 0X0B
RXF3SIDH EQU 0X10
RXF3SIDL EQU 0X11
RXF3EID8 EQU 0X12
RXF3EID0 EQU 0X13
RXF4SIDH EQU 0X14
RXF4SIDL EQU 0X15
RXF4EID8 EQU 0X16
RXF4EID0 EQU 0X17
RXF5SIDH EQU 0X18
RXF5SIDL EQU 0X19
RXF5EID8 EQU 0X1A
RXF5EID0 EQU 0X1B
;****************************************************
;**** THIRD PORTION : TRANSMIT IDs & BUFFER
;****************************************************
TXB0SIDH EQU 0X31
TXB0SIDL EQU 0X32
TXB0EID8 EQU 0X33
TXB0EID0 EQU 0X34
TXB0DLC EQU 0X35
TXB0D0 EQU 0X36
TXB0D1 EQU 0X37
TXB0D2 EQU 0X38
TXB0D3 EQU 0X39
TXB0D4 EQU 0X3A
TXB0D5 EQU 0X3B
TXB0D6 EQU 0X3C
TXB0D7 EQU 0X3D
;**** TRANSMIT BUFFER 1 ..
TXB1SIDH EQU 0X41
TXB1SIDL EQU 0X42
TXB1EID8 EQU 0X43
TXB1EID0 EQU 0X44
TXB1DLC EQU 0X45
TXB1D0 EQU 0X46
TXB1D1 EQU 0X47
TXB1D2 EQU 0X48
TXB1D3 EQU 0X49
TXB1D4 EQU 0X4A
TXB1D5 EQU 0X4B
TXB1D6 EQU 0X4C
TXB1D7 EQU 0X4D
;**** TRANSMIT BUFFER 2 ..
TXB2SIDH EQU 0X51
TXB2SIDL EQU 0X52
TXB2EID8 EQU 0X53
TXB2EID0 EQU 0X54
TXB2DLC EQU 0X55
TXB2D0 EQU 0X56
TXB2D1 EQU 0X57
TXB2D2 EQU 0X58
TXB2D3 EQU 0X59
TXB2D4 EQU 0X5A
TXB2D5 EQU 0X5B
TXB2D6 EQU 0X5C
TXB2D7 EQU 0X5D
;****************************************************
;**** FOURTH PORTION : RECEIVE IDs & BUFFER
;****************************************************
RXB0SIDH EQU 0X61
RXB0SIDL EQU 0X62
RXB0EID8 EQU 0X63
RXB0EID0 EQU 0X64
RXB0DLC EQU 0X65
RXB0D0 EQU 0X66
RXB0D1 EQU 0X67
RXB0D2 EQU 0X68
RXB0D3 EQU 0X69
RXB0D4 EQU 0X6A
RXB0D5 EQU 0X6B
RXB0D6 EQU 0X6C
RXB0D7 EQU 0X6D
;**** RECEIVE BUFFER 1 ...
RXB1SIDH EQU 0X71
RXB1SIDL EQU 0X72
RXB1EID8 EQU 0X73
RXB1EID0 EQU 0X74
RXB1DLC EQU 0X75
RXB1D0 EQU 0X76
RXB1D1 EQU 0X77
RXB1D2 EQU 0X78
RXB1D3 EQU 0X79
RXB1D4 EQU 0X7A
RXB1D5 EQU 0X7B
RXB1D6 EQU 0X7C
RXB1D7 EQU 0X7D
;******************************************************************
;**** RESET VALUE OF EACH CONTROL REGISTER !!
;******************************************************************
; BFPCTRL --00 0000
; TXRTSCTRL --XX X000
; CANSTAT 100- 000-
; CANCTRL 1110 -111
; TEC 0000 0000
; REC 0000 0000
; CNF3 -0-- -000
; CNF2 0000 0000
; CNF1 0000 0000
; CANINTE 0000 0000
; CANINTF 0000 0000
; EFLG 0000 0000
; TXB0CTRL -000 0-00
; TXB1CTRL -000 0-00
; TXB2CTRL -000 0-00
; RXB0CTRL -00- 0000
; RXB1CTRL -00- 0000
;******************************************************************
TempH RES 1 ; TempH & TempL are used for Bin2BCD subroutine
TempL RES 1 ;
TempVar1 RES 1
TempVar2 RES 1
LoopCntr RES 1
SPI_Temp RES 1 ; Used for SPI Temp in order to keep the content of W reg
Dlen_2510 RES 1
Addr_2510 RES 1
Buf_2510 RES 8
STATUS_2510 RES 1
CAN_PORTD RES 1
CAN_PWM RES 1
Temp_ADC RES 1
;******************************************************************
;**** The location of Flash Registers is BANK3
;**** Because the EEDATA & EEADR are located @ Bnk 3
;******************************************************************
w_temp EQU 0x72
status_temp EQU 0x73
pclath_temp EQU 0x74
PORT_CS2510 EQU PORTC
#define CS2510 PORTC,0 ; RC2 is CS control signal of this 2510 EVM Board !!
#define MESSAGE_NO1 .250 ;
#define PWM_DUTY .255
; Locates startup code @ the reset vector
;*******************************************************
;**** MACRO RESET_2510
;**** RESET MCP2510
;*******************************************************
RESET_2510 MACRO
BANKSEL PORT_CS2510
bcf CS2510
movlw CMD_RESET
call Write_SPI_Byte
BANKSEL PORT_CS2510
bsf CS2510
ENDM
;*******************************************************
;**** MACRO WRITE_2510 W_ADD,W_DATA
;**** Write W_DATA into W_ADD
;*******************************************************
WRITE_2510 MACRO W_ADD,W_DATA
BANKSEL PORT_CS2510
bcf CS2510
movlw CMD_WRITE
call Write_SPI_Byte
movlw W_ADD
call Write_SPI_Byte
movlw W_DATA
call Write_SPI_Byte
BANKSEL PORT_CS2510
bsf CS2510
ENDM
;*******************************************************
;**** MACRO READ_2510 R_ADD
;**** Read data @ address R_ADD
;*******************************************************
READ_2510 MACRO R_ADD
BANKSEL PORT_CS2510
bcf CS2510
movlw CMD_READ
call Write_SPI_Byte
movlw R_ADD
call Write_SPI_Byte
movlw 0xff
call Write_SPI_Byte
BANKSEL PORT_CS2510
bsf CS2510
ENDM
;*******************************************************
;**** MACRO MODIFY_2510 M_ADD,M_MASK,M_DATA
;**** Target address M_ADD
;**** Mask Pattern @ M_MASK
;**** Data Pattern @ M_DATA
;*******************************************************
MODIFY_2510 MACRO M_ADD,M_MASK,M_DATA
BANKSEL PORT_CS2510
bcf CS2510
movlw CMD_MODIFY
call Write_SPI_Byte
movlw M_ADD
call Write_SPI_Byte
movlw M_MASK
call Write_SPI_Byte
movlw M_DATA
call Write_SPI_Byte
BANKSEL PORT_CS2510
bsf CS2510
ENDM
;*******************************************************
;**** MACRO SEND_TXB0
;**** SEND COMMAND TO START TXBO TRANSMISSION
;*******************************************************
SEND_TXB0 MACRO
BANKSEL PORT_CS2510
bcf CS2510
movlw CMD_RTS0 ; TRansmit Buffer 0
call Write_SPI_Byte
BANKSEL PORT_CS2510
bsf CS2510
ENDM
;*******************************************************
;**** END OF MACRO DECALRATION ^^^^^^^^^^^^^^^^^^^^^^^
;*******************************************************
START CODE H'000'
nop
goto Prog_Main
SEC_ISR CODE H'004'
goto ISRs
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -