#ifndef __NCES_CAN_H__ #define __NCES_CAN_H__ #include "Os.h" #include "prc_sil.h" #include "de0_nano.h" /* * NCES CAN のレジスタ定義 */ #define EXTEND_CAN_ID_LENGTH 18U /* 拡張分のCAN-ID幅 */ #define ACCEPTANCE_OFFSET 21U /* アクセプタンスコードレジスタのオフセット */ #define ACCEPTANCE_MASK 0x001FFFFFU /* アクセプタンスマスクレジスタに設定するマスク */ /* モードレジスタ */ #define RESET_MODE 0x00000001U /* 動作モードをRESET_MODEにする */ #define OPERATING_MODE 0x00000000U /* 動作モードをOPERATING_MODEにする */ #define LISTEN_ONLY_MODE 0x00000002U /* 送信禁止 */ #define NO_LISTEN_ONLY_MODE 0x00000000U /* 送信許可 */ #define NO_SEND_ACK_MODE 0x00000004U /* ACK送信禁止 */ #define SEND_ACK_MODE 0x00000000U /* ACK送信 */ #define SINGLE_FILTER_MODE 0x00000008U /* Single filter mode */ #define DUAL_FILTER_MODE 0x00000000U /* Dual filter mode */ #define CANC_MODE_START (OPERATING_MODE | NO_LISTEN_ONLY_MODE | SEND_ACK_MODE | SINGLE_FILTER_MODE) /* CANコントローラのSTART状態 */ #define CANC_MODE_STOP (RESET_MODE | NO_LISTEN_ONLY_MODE | SEND_ACK_MODE | SINGLE_FILTER_MODE) /* CANコントローラのSTOP状態 */ /* 割込み要求 */ #define RECEIVE_IRQ 0x00000001U /* 受信完了 */ #define TRANSMIT_IRQ 0x00000002U /* 送信完了 */ #define IRQ_SET_DISABLE 0x00000000U /* [割込み許可レジスタ]全割込み要求を禁止 */ #define IRQ_SET_ENABLE 0x000000FFU /* [割込み許可レジスタ]指定の割込み要求を許可 */ #define TXABORT_CLEAR 0x0000FFFFU /* [送信キャンセルレジスタ]全メッセージボックス送信キャンセル */ #define TXCMP_CLEAR 0x0000FFFFU /* [送信完了レジスタ]送信完了ビットクリア */ #define TXABORTCMP_CLEAR 0x0000FFFFU /* [送信キャンセル完了レジスタ]送信キャンセル完了ビットクリア */ #define RXWAIT_OFF 0x00000000U /* [受信ウェイトレジスタ]ウェイト処理OFF */ #define RXCMP_CLEAR 0xFFFFFFFFU /* [受信完了レジスタ]受信完了ビットクリア */ #define RXSELFREQ_CLEAR 0x00000000U /* [セルフ受信要求レジスタ]送受信要求なし */ #define ERROR_CNT_CLEAR 0x00000060U /* [エラーカウンタレジスタ]エラーカウンタを初期値にする */ #define BAUDRATE_250 0x80007F03U /* [クロック制御,バスタイミングレジスタ]ボーレート:250kbps */ #define BAUDRATE_500 0x80007F01U /* [クロック制御,バスタイミングレジスタ]ボーレート:500kbps */ #define IRQ_RXEN_PERMIT 0xFFFFFFFFU /* [受信割り込み許可レジスタ]受信割り込み許可 */ #define MASK_CAN_ID_MASK 0x1FFFFFFFU /* CanId取得マスク */ #define MASK_4BIT 0x0000000FU /* 4ビットマスク */ #define MASK_8BIT 0x000000FFU /* 8ビットマスク */ /* */ /* 各レジスタまでのオフセットアドレス */ #define CANC_MODE_REG 0x0000U /* モード */ #define CANC_TXREQ_REG 0x0004U #define CANC_TXABORT_REG 0x0008U /* 送信キャンセルレジスタ */ #define CANC_TXCMP_REG 0x000CU #define CANC_TXABORTCMP_REG 0x0010U #define CANC_RXWAIT_REG 0x0014U #define CANC_RXCMP_REG 0x0018U #define CANC_RXOVERWRITE_REG 0x001CU #define CANC_RXSELFREQ_REG 0x0020U #define CANC_STATUS_REG 0x0024U #define CANC_IRQ_REG 0x0028U #define CANC_IRQ_EN_REG 0x002CU /* 割込み許可レジスタ */ #define CANC_IRQ_RXEN_REG 0x0030U #define CANC_CLKDIV_BUSTIM_REG 0x0034U /* クロック制御,バスタイミング */ #define CANC_ACCEPTANCE_CODE_REG 0x0038U /* アクセプタンスコードレジスタ */ #define CANC_ACCEPTANCE_MASK_REG 0x003CU /* アクセプタンスマスクレジスタ */ #define CANC_ARBITRATION_LOST_CAPTURE_REG 0x0040U #define CANC_ERROR_CAPTURE_CODE_REG 0x0044U #define CANC_ERROR_CNT_REG 0x0048U #define CANC_MBOXWIN_REG 0x004CU /* メッセージボックスウィンドウレジスタ */ #define CANC_RXMBOX_ACCEPTANCE_CODE_REG 0x0070U /* 受信メッセージボックスのアクセプタンスコードレジスタ */ #define CANC_RXMBOX_ACCEPTANCE_MASK_REG 0x0074U /* 受信メッセージボックスのアクセプタンスマスクレジスタ */ #define CANC_TXMBOX_DATA0_REG 0x0100U #define CANC_TXMBOX_DATA1_REG 0x0104U #define CANC_TXMBOX_DATA2_REG 0x0108U #define CANC_TXMBOX_DATA3_REG 0x010CU #define CANC_RXMBOX_DATA0_REG 0x0200U #define CANC_RXMBOX_DATA1_REG 0x0204U #define CANC_RXMBOX_DATA2_REG 0x0208U #define CANC_RXMBOX_DATA3_REG 0x020CU #define SIL_REW_IOP_CANC_0_BASE(mem) sil_rew_iop((void *) (CANC_0_BASE + (mem))) #define SIL_WRW_IOP_CANC_0_BASE(mem, data) sil_wrw_iop((void *) (CANC_0_BASE + (mem)), (data)) /* 読取り用レジスタアクセスマクロ */ #define CANC_RD_TXCMP_REG() SIL_REW_IOP_CANC_0_BASE(CANC_TXCMP_REG) #define CANC_RD_TXABORTCMP_REG() SIL_REW_IOP_CANC_0_BASE(CANC_TXABORTCMP_REG) #define CANC_RD_RXWAIT_REG() SIL_REW_IOP_CANC_0_BASE(CANC_RXWAIT_REG) #define CANC_RD_RXCMP_REG() SIL_REW_IOP_CANC_0_BASE(CANC_RXCMP_REG) #define CANC_RD_RXOVERWRITE_REG() SIL_REW_IOP_CANC_0_BASE(CANC_RXOVERWRITE_REG) #define CANC_RD_STATUS_REG() SIL_REW_IOP_CANC_0_BASE(CANC_STATUS_REG) #define CANC_RD_IRQ_REG() SIL_REW_IOP_CANC_0_BASE(CANC_IRQ_REG) #define CANC_RD_CLKDIV_BUSTIM_REG() SIL_REW_IOP_CANC_0_BASE(CANC_CLKDIV_BUSTIM_REG) #define CANC_RD_ERROR_CNT_REG() SIL_REW_IOP_CANC_0_BASE(CANC_ERROR_CNT_REG) #define CANC_RD_RXMBOX_DATA0_REG(box_num) SIL_REW_IOP_CANC_0_BASE((CANC_RXMBOX_DATA0_REG + (0x0010U * (box_num)))) #define CANC_RD_RXMBOX_DATA1_REG(box_num) SIL_REW_IOP_CANC_0_BASE((CANC_RXMBOX_DATA1_REG + (0x0010U * (box_num)))) #define CANC_RD_RXMBOX_DATA2_REG(box_num) SIL_REW_IOP_CANC_0_BASE((CANC_RXMBOX_DATA2_REG + (0x0010U * (box_num)))) #define CANC_RD_RXMBOX_DATA3_REG(box_num) SIL_REW_IOP_CANC_0_BASE((CANC_RXMBOX_DATA3_REG + (0x0010U * (box_num)))) /* 書込み用レジスタアクセスマクロ */ #define CANC_WR_MODE_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_MODE_REG, data) #define CANC_WR_TXREQ_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_TXREQ_REG, data) #define CANC_WR_TXABORT_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_TXABORT_REG, data) #define CANC_WR_TXCMP_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_TXCMP_REG, data) #define CANC_WR_TXABORTCMP_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_TXABORTCMP_REG, data) #define CANC_WR_RXWAIT_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_RXWAIT_REG, data) #define CANC_WR_RXCMP_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_RXCMP_REG, data) #define CANC_WR_RXSELFREQ_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_RXSELFREQ_REG, data) #define CANC_WR_IRQ_EN_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_IRQ_EN_REG, data) #define CANC_WR_IRQ_RXEN_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_IRQ_RXEN_REG, data) #define CANC_WR_CLKDIV_BUSTIM_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_CLKDIV_BUSTIM_REG, data) #define CANC_WR_ACCEPTANCE_CODE_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_ACCEPTANCE_CODE_REG, data) #define CANC_WR_ACCEPTANCE_MASK_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_ACCEPTANCE_MASK_REG, data) #define CANC_WR_ERROR_CNT_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_ERROR_CNT_REG, data) #define CANC_WR_MBOXWIN_REG(box_num) SIL_WRW_IOP_CANC_0_BASE(CANC_MBOXWIN_REG, ((box_num) << 16)) #define CANC_WR_RXMBOX_ACCEPTANCE_CODE_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_RXMBOX_ACCEPTANCE_CODE_REG, data) #define CANC_WR_RXMBOX_ACCEPTANCE_MASK_REG(data) SIL_WRW_IOP_CANC_0_BASE(CANC_RXMBOX_ACCEPTANCE_MASK_REG, data) #define CANC_WR_TXMBOX_DATA0_REG(data, box_num) SIL_WRW_IOP_CANC_0_BASE((CANC_TXMBOX_DATA0_REG + (0x0010U * (box_num))), data) #define CANC_WR_TXMBOX_DATA1_REG(data, box_num) SIL_WRW_IOP_CANC_0_BASE((CANC_TXMBOX_DATA1_REG + (0x0010U * (box_num))), data) #define CANC_WR_TXMBOX_DATA2_REG(data, box_num) SIL_WRW_IOP_CANC_0_BASE((CANC_TXMBOX_DATA2_REG + (0x0010U * (box_num))), data) #define CANC_WR_TXMBOX_DATA3_REG(data, box_num) SIL_WRW_IOP_CANC_0_BASE((CANC_TXMBOX_DATA3_REG + (0x0010U * (box_num))), data) /*---------------------------------------------------------------------- マクロ定義 ----------------------------------------------------------------------*/ #define DIR_RECV ( 0 ) /* 受信方向 */ #define DIR_SEND ( 1 ) /* 送信方向 */ /* ステータス関係 */ #define STATUS_OK ( 0 ) #define STATUS_ERROR ( 1 ) #define STATUS_READY ( 2 ) #define STATUS_SEND ( 3 ) #define STATUS_RECV ( 4 ) #define BYTE_LENGTH ( 4 ) /*---------------------------------------------------------------------- タイプ定義 ----------------------------------------------------------------------*/ /* ステータス */ typedef uint8 STATUS; /*---------------------------------------------------------------------- プロトタイプ宣言 ----------------------------------------------------------------------*/ extern STATUS NcanInit(uint8 no); extern void NcanEnable(uint8 no); extern void NcanDisable(uint8 no); extern STATUS NcanComStatus(uint8 no); extern STATUS NcanSetTxData(uint8 no, uint8 mb_num, uint8 id, uint8 *p_data, uint8 len ); extern STATUS NcanGetRxData(uint8 no, uint8 mb_num, uint8 *p_data, uint8 *p_len ); extern STATUS NcanSetMailBoxInfo(uint8 no, uint8 mb_num, uint8 direction, uint8 ide, uint32 id, uint8 mask, uint32 remote); extern void Ncan0InterruptRx(void); extern void Ncan0InterruptTx(void); /*---------------------------------------------------------------------- グローバル変数(外部参照) ----------------------------------------------------------------------*/ #endif /* __NCES_CAN_H__ */