Skip to content

Commit 68fe402

Browse files
committed
[CAN] adding raw class first stage
1 parent ecfea6d commit 68fe402

File tree

5 files changed

+141
-161
lines changed

5 files changed

+141
-161
lines changed

hardware/arduino/sam/libraries/CAN/CAN.cpp

Lines changed: 0 additions & 129 deletions
This file was deleted.

hardware/arduino/sam/libraries/CAN/CAN.h

Whitespace-only changes.
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#include "CANRaw.h"
2+
#include "sn65hvd234.h"
3+
4+
CANRawClass::CANRawClass( Can* pCan )
5+
{
6+
m_pCan=pCan ;
7+
}
8+
9+
uint32_t CANRawClass::begin( uint32_t dwPinEN, uint32_t dwPinRs, uint32_t dwBaudrate )
10+
{
11+
uint32_t dwPins ;
12+
13+
/* Initialize CAN pins */
14+
if ( m_pCan == CAN0 )
15+
{
16+
dwPins=PINS_CAN0 ;
17+
}
18+
else
19+
{
20+
dwPins=PINS_CAN1 ;
21+
}
22+
23+
PIO_Configure(
24+
g_APinDescription[dwPins].pPort,
25+
g_APinDescription[dwPins].ulPinType,
26+
g_APinDescription[dwPins].ulPin,
27+
g_APinDescription[dwPins].ulPinConfiguration);
28+
29+
/* Initialize CAN Transceiver */
30+
SN65HVD234_Init( &m_Transceiver ) ;
31+
SN65HVD234_SetRs( &m_Transceiver, dwPinRs ) ;
32+
SN65HVD234_SetEN( &m_Transceiver, dwPinEN ) ;
33+
/* Enable CAN Transceiver */
34+
SN65HVD234_DisableLowPower( &m_Transceiver ) ;
35+
SN65HVD234_Enable( &m_Transceiver ) ;
36+
37+
if ( can_init( m_pCan, SystemCoreClock, 1000 ) == 1 )
38+
{
39+
can_reset_all_mailbox( m_pCan ) ;
40+
}
41+
else
42+
{
43+
puts( "ERROR CAN initialisation (synchro)" ) ;
44+
45+
return -1 ;
46+
}
47+
48+
return 0 ;
49+
}
50+
51+
uint32_t CANRawClass::end( void )
52+
{
53+
/* Disable CAN Controller */
54+
can_disable( m_pCan ) ;
55+
56+
/* Disable CAN Transceiver */
57+
SN65HVD234_EnableLowPower( &m_Transceiver ) ;
58+
SN65HVD234_Disable( &m_Transceiver ) ;
59+
60+
return 0 ;
61+
}
62+
63+
/*----------------------------------------------------------------------------
64+
* Exported objects
65+
*----------------------------------------------------------------------------*/
66+
CANRawClass CANRaw0( CAN0 ) ;
67+
CANRawClass CANRaw1( CAN1 ) ;
68+
69+
/*----------------------------------------------------------------------------
70+
* Exported functions
71+
*----------------------------------------------------------------------------*/
72+
73+
/**
74+
* \brief Default interrupt handler for CAN 0.
75+
*/
76+
void CAN0_IrqHandler( void )
77+
{
78+
CAN_Handler( CAN0, &gCanTransfer0 ) ;
79+
}
80+
81+
/**
82+
* \brief Default interrupt handler for CAN 1.
83+
*/
84+
void CAN1_IrqHandler( void )
85+
{
86+
CAN_Handler( CAN1, &gCanTransfer1 ) ;
87+
}
88+
89+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#ifndef _CAN_LIBRARY_
2+
#define _CAN_LIBRARY_
3+
4+
#include "sn65hvd234.h"
5+
6+
class CANRawClass
7+
{
8+
protected:
9+
/* CAN peripheral, set by constructor */
10+
Can* m_pCan ;
11+
12+
/* CAN Transceiver */
13+
SSN65HVD234_Data m_Transceiver ;
14+
15+
/** CAN Transfer */
16+
can_mb_conf_t m_Mailbox ;
17+
18+
private:
19+
20+
public:
21+
// Constructor
22+
CANRawClass( Can* pCan ) ;
23+
24+
uint32_t begin( uint32_t dwPinEN, uint32_t dwPinRs, uint32_t dwBaudrate ) ;
25+
uint32_t end( void ) ;
26+
27+
} ;
28+
29+
extern CANRawClass CANRaw0 ;
30+
extern CANRawClass CANRaw1 ;
31+
32+
#endif // _CAN_LIBRARY_

hardware/arduino/sam/libraries/CAN/examples/Arduino_Due_CAN_Sample_1/Arduino_Due_CAN_Sample_1.ino

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
// Modified from Atmel ASF SAM3X-EK CAN sample by Wilfredo Molina 2012
55

66
// Required libraries
7-
#include <can.h>
8-
#include <sysclk.h>
9-
#include <sam3x8e.h>
7+
#include "variant.h"
8+
#include "CAN.h"
109

1110
#define TEST1_CAN_COMM_MB_IDX 0
1211
#define TEST1_CAN_TRANSFER_ID 0x07
@@ -25,69 +24,58 @@ can_mb_conf_t can1_mailbox;
2524

2625
void setup()
2726
{
28-
// start serial port at 9600 bps:
27+
// start serial port at 9600 bps:
2928
Serial.begin(9600);
3029
Serial.println("Type CAN message to send");
31-
while (Serial.available() == 0);
30+
while (Serial.available() == 0);
3231
}
3332

3433
void loop(){
35-
34+
3635
while (Serial.available() > 0) {
3736
CAN_MSG_1 = Serial.parseInt();
38-
if (Serial.read() == '\n') {
37+
if (Serial.read() == '\n') {
3938
Serial.print("Sent value= ");
4039
Serial.println(CAN_MSG_1);
41-
delay(1000);
40+
delay(1000);
4241
}
4342
}
44-
45-
uint32_t ul_sysclk;
46-
47-
/* Initialize the SAM system. */
48-
sysclk_init();
49-
board_init();
50-
51-
// Enable CAN0 & CAN1 clock
43+
44+
// Enable CAN0 & CAN1 clock
5245
pmc_enable_periph_clk(ID_CAN0);
5346
pmc_enable_periph_clk(ID_CAN1);
54-
47+
5548
// Initialize CAN0 and CAN1, baudrate is 1Mb/s
56-
ul_sysclk = sysclk_get_cpu_hz();
57-
can_init(CAN0, ul_sysclk, CAN_BPS_1000K);
58-
can_init(CAN1, ul_sysclk, CAN_BPS_1000K);
59-
60-
// Reset all CAN0 and CAN1 mailboxes
61-
can_reset_all_mailbox(CAN0);
62-
can_reset_all_mailbox(CAN1);
63-
49+
can_init(CAN0, SystemCoreClock, CAN_BPS_1000K);
50+
can_init(CAN1, SystemCoreClock, CAN_BPS_1000K);
51+
6452
// Initialize CAN1 mailbox 0 as receiver, frame ID is 0x07
65-
reset_mailbox_conf(&can1_mailbox);
53+
can_reset_mailbox_data(&can1_mailbox);
6654
can1_mailbox.ul_mb_idx = TEST1_CAN_COMM_MB_IDX;
6755
can1_mailbox.uc_obj_type = CAN_MB_RX_MODE;
6856
can1_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk;
6957
can1_mailbox.ul_id = CAN_MID_MIDvA(TEST1_CAN_TRANSFER_ID);
7058
can_mailbox_init(CAN1, &can1_mailbox);
71-
59+
7260
// Initialize CAN0 mailbox 0 as transmitter, transmit priority is 15
73-
reset_mailbox_conf(&can0_mailbox);
61+
can_reset_mailbox_data(&can0_mailbox);
7462
can0_mailbox.ul_mb_idx = TEST1_CAN_COMM_MB_IDX;
7563
can0_mailbox.uc_obj_type = CAN_MB_TX_MODE;
7664
can0_mailbox.uc_tx_prio = TEST1_CAN0_TX_PRIO;
7765
can0_mailbox.uc_id_ver = 0;
7866
can0_mailbox.ul_id_msk = 0;
7967
can_mailbox_init(CAN0, &can0_mailbox);
8068

81-
// Prepare transmit ID, data and data length in CAN0 mailbox 0
69+
// Prepare transmit ID, data and data length in CAN0 mailbox 0
8270
can0_mailbox.ul_id = CAN_MID_MIDvA(TEST1_CAN_TRANSFER_ID);
8371
can0_mailbox.ul_datal = CAN_MSG_1;
8472
can0_mailbox.ul_datah = CAN_MSG_DUMMY_DATA;
8573
can0_mailbox.uc_length = MAX_CAN_FRAME_DATA_LEN;
8674
can_mailbox_write(CAN0, &can0_mailbox);
87-
75+
8876
// Send out the information in the mailbox
8977
can_global_send_transfer_cmd(CAN0, CAN_TCR_MB0);
90-
78+
9179
// Wait for CAN1 mailbox 0 to receive the data
9280
while (!(can_mailbox_get_status(CAN1, 0) & CAN_MSR_MRDY)) {
9381
}
@@ -97,4 +85,4 @@ void loop(){
9785
Serial.println(can1_mailbox.ul_datal);
9886

9987
while (1) {}
100-
}
88+
}

0 commit comments

Comments
 (0)