@@ -70,58 +70,89 @@ int ESP32SJA1000Class::begin(long baudRate)
7070 modifyRegister (REG_BTR0, 0xc0 , 0x40 ); // SJW = 1
7171 modifyRegister (REG_BTR1, 0x70 , 0x10 ); // TSEG2 = 1
7272
73- switch (baudRate) {
74- case (long )1000E3 :
75- modifyRegister (REG_BTR1, 0x0f , 0x04 );
76- modifyRegister (REG_BTR0, 0x3f , 4 );
77- break ;
78-
79- case (long )500E3 :
80- modifyRegister (REG_BTR1, 0x0f , 0x0c );
81- modifyRegister (REG_BTR0, 0x3f , 4 );
82- break ;
83-
84- case (long )250E3 :
85- modifyRegister (REG_BTR1, 0x0f , 0x0c );
86- modifyRegister (REG_BTR0, 0x3f , 9 );
87- break ;
88-
89- case (long )200E3 :
90- modifyRegister (REG_BTR1, 0x0f , 0x0c );
91- modifyRegister (REG_BTR0, 0x3f , 12 );
92- break ;
93-
94- case (long )125E3 :
95- modifyRegister (REG_BTR1, 0x0f , 0x0c );
96- modifyRegister (REG_BTR0, 0x3f , 19 );
97- break ;
98-
99- case (long )100E3 :
100- modifyRegister (REG_BTR1, 0x0f , 0x0c );
101- modifyRegister (REG_BTR0, 0x3f , 24 );
102- break ;
103-
104- case (long )80E3 :
105- modifyRegister (REG_BTR1, 0x0f , 0x0c );
106- modifyRegister (REG_BTR0, 0x3f , 30 );
107- break ;
108-
109- case (long )50E3 :
110- modifyRegister (REG_BTR1, 0x0f , 0x0c );
111- modifyRegister (REG_BTR0, 0x3f , 49 );
112- break ;
113-
114- /*
115- Due to limitations in ESP32 hardware and/or RTOS software, baudrate can't be lower than 50kbps.
116- See https://esp32.com/viewtopic.php?t=2142
117- */
118- default :
119- return 0 ;
120- break ;
73+ esp_chip_info_t chip;
74+ esp_chip_info (&chip);
75+
76+ if (baudRate >= 50E3 ) {
77+
78+ if (chip.revision >= 2 ) {
79+ modifyRegister (REG_IER, 0x10 , 0 ); // From rev2 used as "divide BRP by 2"
80+ }
81+
82+ switch (baudRate) {
83+ case (long )1000E3 :
84+ modifyRegister (REG_BTR1, 0x0f , 0x04 );
85+ modifyRegister (REG_BTR0, 0x3f , 4 );
86+ break ;
87+
88+ case (long )500E3 :
89+ modifyRegister (REG_BTR1, 0x0f , 0x0c );
90+ modifyRegister (REG_BTR0, 0x3f , 4 );
91+ break ;
92+
93+ case (long )250E3 :
94+ modifyRegister (REG_BTR1, 0x0f , 0x0c );
95+ modifyRegister (REG_BTR0, 0x3f , 9 );
96+ break ;
97+
98+ case (long )200E3 :
99+ modifyRegister (REG_BTR1, 0x0f , 0x0c );
100+ modifyRegister (REG_BTR0, 0x3f , 12 );
101+ break ;
102+
103+ case (long )125E3 :
104+ modifyRegister (REG_BTR1, 0x0f , 0x0c );
105+ modifyRegister (REG_BTR0, 0x3f , 19 );
106+ break ;
107+
108+ case (long )100E3 :
109+ modifyRegister (REG_BTR1, 0x0f , 0x0c );
110+ modifyRegister (REG_BTR0, 0x3f , 24 );
111+ break ;
112+
113+ case (long )80E3 :
114+ modifyRegister (REG_BTR1, 0x0f , 0x0c );
115+ modifyRegister (REG_BTR0, 0x3f , 30 );
116+ break ;
117+
118+ case (long )50E3 :
119+ modifyRegister (REG_BTR1, 0x0f , 0x0c );
120+ modifyRegister (REG_BTR0, 0x3f , 49 );
121+ break ;
122+
123+ default :
124+ return 0 ;
125+ break ;
126+ }
127+ }else {
128+
129+ if (chip.revision >= 2 ) {
130+ modifyRegister (REG_IER, 0x10 , 0x10 ); // From rev2 used as "divide BRP by 2"
131+ }else {
132+ return 0 ;
133+ }
134+
135+ switch (baudRate) {
136+
137+ case (long )40E3 :
138+ modifyRegister (REG_BTR1, 0x0f , 0x0c );
139+ modifyRegister (REG_BTR0, 0x3f , 30 );
140+ break ;
141+
142+ case (long )20E3 :
143+ modifyRegister (REG_BTR1, 0x0f , 0x4d );
144+ modifyRegister (REG_BTR0, 0x3f , 30 );
145+ break ;
146+
147+ default :
148+ return 0 ;
149+ break ;
150+ }
151+
121152 }
122153
123154 modifyRegister (REG_BTR1, 0x80 , 0x80 ); // SAM = 1
124- writeRegister (REG_IER, 0xff ); // enable all interrupts
155+ modifyRegister (REG_IER, 0xef , 0xef ); // enable all interrupts
125156
126157 // set filter to allow anything
127158 writeRegister (REG_ACRn (0 ), 0x00 );
0 commit comments