source: rc_os_nios2/atk2-sc1_1.3.2/obj/nios2_dev_rc/nces_can.c@ 128

Last change on this file since 128 was 128, checked in by ertl-honda, 9 years ago

追加.

File size: 8.4 KB
Line 
1/*----------------------------------------------------------------------
2 INCLUDE
3----------------------------------------------------------------------*/
4#include "Os.h"
5#include "nces_can.h"
6#include "rc_car.h"
7
8#define NULL ( 0 )
9
10/* IDƒ^ƒCƒv */
11typedef uint32 TYPE_ID;
12
13typedef struct {
14 TYPE_ID recv_id; /* ŽóM‚µ‚½ID */
15 uint8 mask; /* ƒ}ƒXƒNƒpƒ^[ƒ“ */
16 uint8 enable; /* ƒƒbƒZ[ƒWƒoƒbƒtƒ@—LŒø–³Œø */
17 uint8 len; /* ƒƒbƒZ[ƒWƒf[ƒ^’· */
18 uint8 data[8]; /* ‘—ŽóMƒf[ƒ^ */
19} TYPE_RMB_INFO;
20
21typedef struct {
22 TYPE_ID set_id; /* Ý’肵‚½ID */
23 uint8 mask; /* ƒ}ƒXƒNƒpƒ^[ƒ“ */
24 uint8 enable; /* ƒƒbƒZ[ƒWƒoƒbƒtƒ@—LŒø–³Œø */
25 uint8 len; /* ƒƒbƒZ[ƒWƒf[ƒ^’· */
26 uint8 data[8]; /* ‘—ŽóMƒf[ƒ^ */
27} TYPE_TMB_INFO;
28
29static TYPE_RMB_INFO g_RMB_INFO[DEF_RMB_MAX];
30static TYPE_TMB_INFO g_TMB_INFO[DEF_TMB_MAX];
31
32STATUS
33NcanInit(uint8 no)
34{
35 uint16 j, k;
36
37 for( j = 0; j < DEF_RMB_MAX; j++ )
38 {
39 g_RMB_INFO[j].recv_id = 0;
40 g_RMB_INFO[j].mask = 0;
41 g_RMB_INFO[j].enable = 0;
42 g_RMB_INFO[j].len = 0;
43 for( k = 0; k < 8; k++ )
44 {
45 g_RMB_INFO[j].data[k] = 0;
46 }
47 }
48
49 for( j = 0; j < DEF_TMB_MAX; j++ )
50 {
51 g_TMB_INFO[j].set_id = 0;
52 g_TMB_INFO[j].mask = 0;
53 g_TMB_INFO[j].enable = 0;
54 g_TMB_INFO[j].len = 0;
55 for( k = 0; k < 8; k++ )
56 {
57 g_RMB_INFO[j].data[k] = 0;
58 }
59 }
60
61 /* ƒRƒ“ƒgƒ[ƒ‰‚ð’âŽ~ó‘Ԃŏ‰Šú‰» */
62 CANC_WR_MODE_REG(CANC_MODE_STOP);
63
64 /* Š„ž‚Ý‹–‰Â */
65// CANC_WR_IRQ_EN_REG(IRQ_SET_ENABLE);
66 CANC_WR_IRQ_EN_REG(0x03);
67
68 /* ƒAƒNƒZƒvƒ^ƒ“ƒXƒtƒBƒ‹ƒ^‚̐ݒè */
69 /* ‘S‘̂̃AƒNƒZƒvƒ^ƒ“ƒXƒR[ƒhƒŒƒWƒXƒ^(‘S‚Ä‹–‰Â)‚̐ݒè */
70 CANC_WR_ACCEPTANCE_CODE_REG(0xFFFFFFFFU);
71
72 /* ‘S‘̂̃AƒNƒZƒvƒ^ƒ“ƒXƒ}ƒXƒNƒŒƒWƒXƒ^(‘S‚Ä‹–‰Â)‚̐ݒè */
73 CANC_WR_ACCEPTANCE_MASK_REG(0xFFFFFFFFU);
74
75 /* ƒŒƒWƒXƒ^‚̏‰Šú‰» */
76 /* –¢‘—M‚̃ƒbƒZ[ƒW‚ðƒLƒƒƒ“ƒZƒ‹‚·‚é */
77 CANC_WR_TXABORT_REG(TXABORT_CLEAR);
78
79 /* ƒGƒ‰[ƒJƒEƒ“ƒ^ƒŒƒWƒXƒ^‚Ì’l‚ð‰Šú‰»‚·‚é(‘—MAŽóM‚Æ‚à‚É’l‚ª0‚Å–³‚¢ê‡AŽóMƒGƒ‰[ƒJƒEƒ“ƒ^‚̕ύX‚Í•s‰Â) */
80 CANC_WR_ERROR_CNT_REG(ERROR_CNT_CLEAR);
81
82 /* ƒZƒ‹ƒt‘—ŽóM—v‹ƒŒƒWƒXƒ^‚ð‘—ŽóM—v‹‚𖳂µ‚É‚·‚é */
83 CANC_WR_RXSELFREQ_REG(RXSELFREQ_CLEAR);
84
85 /* ŽóMƒEƒFƒCƒgƒŒƒWƒXƒ^‚ðƒEƒFƒCƒgˆ—ƒIƒt‚É‚·‚é */
86 CANC_WR_RXWAIT_REG(RXWAIT_OFF);
87
88 /* ‘—MŠ®—¹ƒŒƒWƒXƒ^‚𑗐M–¢Š®—¹‚É‚·‚é */
89 CANC_WR_TXCMP_REG(TXCMP_CLEAR);
90
91 /* ‘—MƒLƒƒƒ“ƒZƒ‹Š®—¹ƒŒƒWƒXƒ^‚𑗐MƒLƒƒƒ“ƒZƒ‹–¢Š®—¹‚É‚·‚é */
92 CANC_WR_TXABORTCMP_REG(TXABORTCMP_CLEAR);
93
94 /* ŽóMŠ®—¹ƒŒƒWƒXƒ^‚ðŽóMƒf[ƒ^–³‚µ‚É‚·‚é */
95 CANC_WR_RXCMP_REG(RXCMP_CLEAR);
96
97 /* ŽóMƒI[ƒo[ƒ‰ƒCƒgƒŒƒWƒXƒ^‚ðã‘‚«–¢”­¶‚É‚·‚é */
98 CANC_RD_RXOVERWRITE_REG();
99
100 /* ŽóMŠ„ž‚Ý‹–‰ÂƒŒƒWƒXƒ^‚ðŠ„‚èž‚Ý‹–‰Â‚É‚·‚é */
101 CANC_WR_IRQ_RXEN_REG(IRQ_RXEN_PERMIT);
102
103 /* Š„‚荞‚Ý—v‹ƒŒƒWƒXƒ^‚ðŠ„‚èž‚Ý–¢”­¶‚É‚·‚é */
104 /* read‚·‚邱‚ƂŁA’l‚ª‰Šú’l(Š„ž‚Ý–¢”­¶)‚ɃŠƒZƒbƒg‚³‚ê‚é */
105 CANC_RD_IRQ_REG();
106
107 /* ƒ{[ƒŒ[ƒg‚̐ݒè */
108 CANC_WR_CLKDIV_BUSTIM_REG(BAUDRATE_500);
109
110 return( STATUS_OK );
111}
112
113/** ƒ[ƒ‹ƒ{ƒbƒNƒXÝ’è
114 * @param *mb_num:MB”ԍ†
115 * @param *direction:‘—ŽóM•ûŒü DIR_RECV or DIR_SND
116 * @param ide:IDŽí•Ê
117 * @param *id:ID
118 * @param *mask:ƒ}ƒXƒN
119 * @param remote:ƒf[ƒ^Ží•Ê
120 * @retval STATUS_OK
121 * @retval STATUS_ERROR
122 */
123STATUS
124NcanSetMailBoxInfo(uint8 no, uint8 mb_num, uint8 direction,
125 uint8 ide, uint32 id, uint8 mask, uint32 remote){
126 uint32 can_id_reg;
127 if (direction == DIR_RECV) {
128 /* ‘ΏۂðÝ’è‚·‚é */
129 CANC_WR_MBOXWIN_REG(mb_num);
130
131 /* ŠeŽóMƒƒbƒZ[ƒWƒ{ƒbƒNƒX‚̃AƒNƒZƒvƒ^ƒ“ƒXƒR[ƒhƒŒƒWƒXƒ^‚̐ݒè */
132 can_id_reg = ((uint32) id) << ACCEPTANCE_OFFSET;
133 CANC_WR_RXMBOX_ACCEPTANCE_CODE_REG(can_id_reg);
134
135 /* ŠeŽóMƒƒbƒZ[ƒWƒ{ƒbƒNƒX‚̃AƒNƒZƒvƒ^ƒ“ƒXƒ}ƒXƒNƒŒƒWƒXƒ^‚̐ݒè */
136 CANC_WR_RXMBOX_ACCEPTANCE_MASK_REG(ACCEPTANCE_MASK);
137 }
138
139 if (direction == DIR_SEND) {
140 g_TMB_INFO[mb_num].set_id = id;
141 }
142
143 return( STATUS_OK );
144}
145
146void
147NcanEnable(uint8 no){
148 CANC_WR_MODE_REG(CANC_MODE_START);
149}
150
151void
152NcanDisable(uint8 no){
153 CANC_WR_MODE_REG(CANC_MODE_STOP);
154}
155
156#include "t_syslog.h"
157#include "t_stdlib.h"
158#include "sysmod/serial.h"
159#include "sysmod/syslog.h"
160
161STATUS
162NcanSetTxData(uint8 no, uint8 mb_num, uint8 id, uint8 *p_data, uint8 len){
163 uint8 i, j;
164 uint32 temp_data1 = 0; /* ƒf[ƒ^(1`4byte)Ši”[—p */
165 uint32 temp_data2 = 0; /* ƒf[ƒ^(5`8byte)Ši”[—p */
166 uint32 request_bit;
167
168 /* ƒƒbƒZ[ƒW‚̃f[ƒ^‚ª5byteˆÈã‚È‚çA5byte–ڈȍ~‚ðæ‚Ɏ擾‚·‚é */
169 if (len > BYTE_LENGTH) {
170 /* 5`8byte‚̃f[ƒ^‚ðƒRƒs[‚·‚é */
171 for (i = 0U; i < (len - BYTE_LENGTH); i++) {
172 if (i > 0U) {
173 temp_data2 = temp_data2 << 8U;
174 }
175 temp_data2 = (temp_data2 | p_data[len - (1U + i)]);
176 }
177 }
178 else {
179 i = 0U;
180 }
181
182 /* ƒƒbƒZ[ƒW‚̃f[ƒ^‚ª1byteˆÈã‚È‚çA1byte–ڈȍ~‚ðŽæ“¾‚·‚é */
183 if (len > 0) {
184 /* 1`4byte‚̃f[ƒ^‚ðƒRƒs[‚·‚é */
185 for (j = i; j < len; j++) {
186 if (j > i) {
187 temp_data1 = temp_data1 << 8U;
188 }
189 temp_data1 = (temp_data1 | p_data[len - (1U + j)]);
190 }
191 }
192
193 /* CAN-ID‚ÌŠi”[ */
194 CANC_WR_TXMBOX_DATA0_REG((id << EXTEND_CAN_ID_LENGTH), mb_num);
195
196 /* ƒf[ƒ^’·‚ÌŠi”[ */
197 CANC_WR_TXMBOX_DATA1_REG(len, mb_num);
198
199 if (len > 0) {
200 /* ƒf[ƒ^(1`4)‚ÌŠi”[ */
201 CANC_WR_TXMBOX_DATA2_REG(temp_data1, mb_num);
202 }
203 /* ƒf[ƒ^‚ª5byteˆÈã‚È‚çŠi”[ */
204 if (len > BYTE_LENGTH) {
205 /* ƒf[ƒ^(5`8)‚ÌŠi”[ */
206 CANC_WR_TXMBOX_DATA3_REG(temp_data2, mb_num);
207 }
208
209 SuspendAllInterrupts();
210
211 request_bit = 1U << mb_num;
212 CANC_WR_TXREQ_REG(request_bit);
213
214 ResumeAllInterrupts();
215
216 set_led7(TRUE);
217 return( STATUS_OK );
218}
219
220/*
221 * ƒf[ƒ^‚ðŽóM‚µ‚Ä‚¢‚È‚¢ê‡‚Íp_len‚É0‚ð•Ô‚·
222 */
223STATUS
224NcanGetRxData(uint8 no, uint8 mb_num, uint8 *p_data, uint8 *p_len){
225 uint16 j, len;
226 TYPE_RMB_INFO *rmb_info;
227
228 rmb_info = &g_RMB_INFO[mb_num];
229
230 if( mb_num >= DEF_RMB_MAX )
231 {
232 return( STATUS_ERROR );
233 }
234
235 if( p_data == NULL )
236 {
237 return( STATUS_ERROR );
238 }
239 if( p_len == NULL )
240 {
241 return( STATUS_ERROR );
242 }
243
244 len = (*rmb_info).len;
245 (*rmb_info).len = 0;
246
247 for( j = 0;j < len; j++ )
248 {
249 p_data[j] = (*rmb_info).data[j];
250 }
251
252 *p_len = len;
253
254 if(len != 0){
255 set_led0(FALSE);
256 }
257
258 return( STATUS_OK );
259}
260
261static int cnt;
262
263ISR(Ncan_ISR)
264{
265 uint32 irq_reg;
266 uint32 cmp_reg;
267 uint32 clear_bit;
268 uint32 temp_data;
269 uint32 i;
270 uint32 j;
271 uint32 wait_reg;
272 uint8 can_dlc;
273
274 irq_reg = CANC_RD_IRQ_REG();
275
276 /* ŽóMŠ®—¹Š„ž‚Ý */
277 if ((irq_reg & RECEIVE_IRQ) != 0U) {
278 set_led0(TRUE);
279 clear_bit = 1U;
280 cmp_reg = CANC_RD_RXCMP_REG();
281 if (cmp_reg != 0U) {
282 for (i = 0U; i < DEF_RMB_MAX; i++) {
283 if ((cmp_reg & 1U) != 0U) {
284 /* ‘ΏێóMƒEƒFƒCƒgƒŒƒWƒXƒ^‚ÌŠY“–‚·‚éƒrƒbƒg‚ðƒEƒFƒCƒgˆ—ON‚É‚·‚é */
285 wait_reg = CANC_RD_RXWAIT_REG();
286 wait_reg |= clear_bit;
287 CANC_WR_RXWAIT_REG(wait_reg);
288
289 /* CAN-IDŽæo‚µ */
290 g_RMB_INFO[i].recv_id = ((CANC_RD_RXMBOX_DATA0_REG(i) & MASK_CAN_ID_MASK) >> EXTEND_CAN_ID_LENGTH);
291
292 /* DLC‚ÌŽæ‚èo‚µ */
293 g_RMB_INFO[i].len = (uint8) (CANC_RD_RXMBOX_DATA1_REG(i) & MASK_4BIT);
294 can_dlc = g_RMB_INFO[i].len;
295
296 if (can_dlc > BYTE_LENGTH) {
297 /* 5byteˆÈã‚̏ꍇA5byte–ڈȍ~‚̃ŒƒWƒXƒ^‚à“ǂݍž‚Þ */
298 /* SDU(1`4byte)‚ÌŽæ‚èo‚µ */
299 temp_data = CANC_RD_RXMBOX_DATA2_REG(i);
300 for (j = 0U; j < BYTE_LENGTH; j++) {
301 g_RMB_INFO[i].data[j] = (uint8) (temp_data & MASK_8BIT);
302 temp_data >>= 8U;
303 }
304 /* SDU(5`8byte)‚ÌŽæ‚èo‚µ */
305 temp_data = CANC_RD_RXMBOX_DATA3_REG(i);
306 for (j = BYTE_LENGTH; j < can_dlc; j++) {
307 g_RMB_INFO[i].data[j] = (uint8) (temp_data & MASK_8BIT);
308 temp_data >>= 8U;
309 }
310 }
311 else {
312 /* 4byteˆÈ‰º‚̏ꍇA5byte–ڈȍ~‚̃ŒƒWƒXƒ^‚͓ǂݍž‚Ü‚È‚¢ */
313 /* SDU(1`4byte)‚ÌŽæ‚èo‚µ */
314 temp_data = CANC_RD_RXMBOX_DATA2_REG(i);
315 for (j = 0U; j < can_dlc; j++) {
316 g_RMB_INFO[i].data[j] = (uint8) (temp_data & MASK_8BIT);
317 temp_data >>= 8U;
318 }
319 }
320 CANC_WR_RXCMP_REG(clear_bit);
321 /* ‘ΏێóMƒEƒFƒCƒgƒŒƒWƒXƒ^‚ÌŠY“–‚·‚éƒrƒbƒg‚ðƒEƒFƒCƒgˆ—OFF‚É‚·‚é */
322 wait_reg = wait_reg ^ clear_bit;
323 CANC_WR_RXWAIT_REG(wait_reg);
324 }
325 cmp_reg >>= 1U;
326 clear_bit <<= 1U;
327 }
328 }
329 }
330
331 /* ‘—MŠ®—¹Š„ž‚Ý */
332 if ((irq_reg & TRANSMIT_IRQ) != 0U) {
333 set_led7(FALSE);
334 clear_bit = 1U;
335 cmp_reg = CANC_RD_TXCMP_REG();
336 if (cmp_reg != 0U) {
337 for (i = 0U; i < DEF_TMB_MAX; i++) {
338 if ((cmp_reg & 1U) != 0U) {
339 CANC_WR_TXCMP_REG(clear_bit);
340 }
341 cmp_reg >>= 1U;
342 clear_bit <<= 1U;
343 }
344 }
345 }
346
347 if ((irq_reg & 0x80) == 0x80U) {
348 syslog(LOG_NOTICE, "NCAN : buserror! %d", cnt++);
349 }
350}
Note: See TracBrowser for help on using the repository browser.