📄 sh1sci2.c
字号:
sil_dly_nse(5000); /* 5us 瘦割箕粗 */ } sil_wrb_mem(siopcb->inib->base + TDR ,c); /* トランスミットデ〖タレジスタエンプティˇフラグのクリア*/ sh1_anb_reg(siopcb->inib->base + SSR, (VB)~SSR_TDRE); /* TXENA OFF扩告のため、のコ〖ルバックの钓材 */ sh1sci_ena_cbr(siopcb, SIO_ERDY_SND); } else {#ifdef GDB_STUB gdb_stub_putc( c );#else sil_wrb_mem(siopcb->inib->base + TDR ,c); /* トランスミットデ〖タレジスタエンプティˇフラグのクリア*/ sh1_anb_reg(siopcb->inib->base + SSR, (VB)~SSR_TDRE);#endif }}/* * SIOドライバの介袋步ル〖チン */voidsh1sci_initialize(void){ SIOPCB *siopcb; UINT i; /* * シリアルI/Oポ〖ト瓷妄ブロックの介袋步 */ for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) { siopcb->inib = &siopinib_table[i]; siopcb->openflag = FALSE; }}/* * オ〖プンしているポ〖トがあるか々 */BOOLsh1sci_openflag(ID siopid){ SIOPCB *siopcb; siopcb = get_siopcb(siopid); return (siopcb->openflag);}/* * シリアルI/Oポ〖トのオ〖プン */SIOPCB *sh1sci_opn_por(ID siopid, VP_INT exinf){ SIOPCB *siopcb = get_siopcb(siopid); VB scr, smr; VH pbcr1;#ifdef GDB_STUB if (siopid == PORT1) { siopcb->exinf = exinf; siopcb->openflag = TRUE; return(siopcb); }#endif /* GDB_STUB */ sh1_anb_reg(siopcb->inib->base + SCR, (VB)~(SCR_TE | SCR_RE)); /* 流减慨匿贿 */ /* ピンアサイン * シリアルデバイス极挛の祸灌ではないので * 塑丸はこのファイルに淡揭するのはふさわしくないが、 * hw_serial.cを脱罢するのも妊花なので幻年弄にここに掐れている。 */ pbcr1 = sil_reh_mem((VP)PBCR1); if (siopid == PORT1) { /* PB08:RxD0 PB09:TxD0 */ pbcr1 = (pbcr1 & PBCR1_TD0_RD0_MASK) | PBCR1_TD0 | PBCR1_RD0; } else { /* PB10:RxD1 PB11:TxD1 */ pbcr1 = (pbcr1 & PBCR1_TD1_RD1_MASK) | PBCR1_TD1 | PBCR1_RD1; } sil_wrh_mem((VP)PBCR1, pbcr1); /* 流减慨フォ〖マット */ smr = siopcb->inib->smr_init; sil_wrb_mem(siopcb->inib->base + SMR, smr); sil_wrb_mem(siopcb->inib->base + BRR, (UB)siopcb->inib->baudrate); /* ボ〖レ〖ト肋年 */ /* 充哈み敦贿とクロックソ〖スの联买 */ scr = (VB)(~(SCR_TIE | SCR_RIE | SCR_TE | SCR_RE | SCR_MPIE | SCR_TEIE | SCR_CKE_MASK) | SCR_CKE); sil_wrb_mem(siopcb->inib->base + SCR, scr); /* * ボ〖レ〖トの肋年稿、1カウント尸略たなければならない。 */ sil_dly_nse(siopcb->inib->delay); /* エラ〖フラグをクリア */ sh1_anb_reg(siopcb->inib->base + SSR, (VB)~(SSR_ORER | SSR_FER | SSR_PER)); /* 减慨充り哈み钓材 */ /* 流减慨钓材 */ sh1_orb_reg(siopcb->inib->base + SCR, (SCR_RIE | SCR_TE | SCR_RE)); /* 流慨充哈みの钓材は流慨扩告簇眶で乖う */ siopcb->exinf = exinf; siopcb->openflag = TRUE; return(siopcb);}/* * シリアルI/Oポ〖トのクロ〖ズ */voidsh1sci_cls_por(SIOPCB *siopcb){ /* 流减慨匿贿、充哈み敦贿 */ sh1_anb_reg(siopcb->inib->base + SCR, (VB)~(SCR_TIE | SCR_RIE | SCR_TE | SCR_RE)); siopcb->openflag = FALSE;}/* * シリアルI/Oポ〖トへの矢机流慨 */BOOLsh1sci_snd_chr(SIOPCB *siopcb, char c){ if (sh1sci_putready(siopcb)) { sh1sci_putchar(siopcb, c); return(TRUE); } return(FALSE);}/* * シリアルI/Oポ〖トからの矢机减慨 */INTsh1sci_rcv_chr(SIOPCB *siopcb){ if (sh1sci_getready(siopcb)) { return((INT)(UB) sh1sci_getchar(siopcb)); /* (UB)でキャストするのはゼロ橙磨にするため */ } return(-1);}/* * シリアルI/Oポ〖トからのコ〖ルバックの钓材 */voidsh1sci_ena_cbr(SIOPCB *siopcb, UINT cbrtn){ switch (cbrtn) { case SIO_ERDY_SND: /* 流慨充り哈み妥滇を钓材 */ sh1_orb_reg(siopcb->inib->base + SCR, SCR_TIE); break; case SIO_ERDY_RCV: /* 减慨充り哈み妥滇を钓材 */ sh1_orb_reg(siopcb->inib->base + SCR, SCR_RIE); break; }}/* * シリアルI/Oポ〖トからのコ〖ルバックの敦贿 */voidsh1sci_dis_cbr(SIOPCB *siopcb, UINT cbrtn){ switch (cbrtn) { case SIO_ERDY_SND: /* 流慨充り哈み妥滇を敦贿 */ sh1_anb_reg(siopcb->inib->base + SCR, (VB)~SCR_TIE); if (siopcb->inib->rs485if) { /* 流慨姜位充り哈み钓材 */ sh1_orb_reg(siopcb->inib->base + SCR, SSR_TEND); } break; case SIO_ERDY_RCV: /* 减慨充り哈み妥滇を敦贿 */ sh1_anb_reg(siopcb->inib->base + SCR, (VB)~SCR_RIE); break; }}/* * シリアルI/Oポ〖トに滦する流慨充哈み借妄 */Inline voidsh1sci_isr_siop_out(SIOPCB *siopcb){ VB scr = sil_reb_mem(siopcb->inib->base + SCR); if ((scr & SCR_TIE) != 0 && sh1sci_putready(siopcb)) { /* * 流慨奶梦コ〖ルバックル〖チンを钙び叫すˉ */ sh1sci_ierdy_snd(siopcb->exinf); }}/* * シリアルI/Oポ〖トに滦する流慨姜位充哈み借妄 */Inline voidsh1sci_isr_siop_tend(SIOPCB *siopcb){ /* * RS485 流慨敦贿扩告 */ sh1_anb_reg(siopcb->inib->base + SCR, (VB)~SSR_TEND); sh1_anh_reg(PB_DR, ~PB_TXE1); /* txenaポ〖ト敦贿 */}/* * シリアルI/Oポ〖トに滦する减慨充哈み借妄 */Inline voidsh1sci_isr_siop_in(SIOPCB *siopcb){ VB scr = sil_reb_mem(siopcb->inib->base + SCR); if ((scr & SCR_RIE) != 0 && sh1sci_getready(siopcb)) { /* * 减慨奶梦コ〖ルバックル〖チンを钙び叫すˉ */ sh1sci_ierdy_rcv(siopcb->exinf); }}/* * SIO流慨充哈みサ〖ビスル〖チン * * SH1柒垄のSCIでは充哈み戎规が流减慨侍、チャネル侍に尸かれているので、 * SCI0の流慨充哈み笆嘲でこのル〖チンが钙ばれることはない * */voidsh1sci_isr_out(void){ if (siopcb_table[0].openflag) { sh1sci_isr_siop_out(&(siopcb_table[0])); }}/* * SIO减慨充哈みサ〖ビスル〖チン * * SH1柒垄のSCIでは充哈み戎规が流减慨侍、チャネル侍に尸かれているので、 * SCI0の减慨充哈み笆嘲でこのル〖チンが钙ばれることはない * */voidsh1sci_isr_in(void){ if (siopcb_table[0].openflag) { sh1sci_isr_siop_in(&(siopcb_table[0])); }}/* * SIO减慨エラ〖充哈みサ〖ビスル〖チン * * SH1柒垄のSCIでは充哈み戎规がチャネル侍に尸かれているので、 * SCI0の减慨エラ〖充哈み笆嘲でこのル〖チンが钙ばれることはない * * エラ〖借妄极挛はエラ〖フラグのクリアのみにとどめている。 * ˇオ〖バ〖ランエラ〖 * ˇフレ〖ミングエラ〖 * ˇパリティエラ〖 */voidsh1sci_isr_error(void){ VB ssr0; if (siopcb_table[0].openflag) { ssr0 = sil_reb_mem(SCI_SSR0); /* 1刨粕み叫して */ ssr0 &= ~(SSR_RDRF | SSR_ORER | SSR_FER | SSR_PER); sil_wrb_mem(SCI_SSR0, ssr0); /* エラ〖フラグクリア */ }}/* * ポ〖リングによる矢机の流慨 */voidsh1sci_putc_pol(char c){ while(!sh1sci_putready(&siopcb_table[0])); sh1sci_putchar(&siopcb_table[0], c);}/* シリアル2ch誊 */#if TNUM_SIOP >= 2/* * SIO流慨充哈みサ〖ビスル〖チン * * SH1柒垄のSCIでは充哈み戎规が流减慨侍、チャネル侍に尸かれているので、 * SCI1の流慨充哈み笆嘲でこのル〖チンが钙ばれることはない * */voidsh1sci2_isr_out(void){ if (siopcb_table[1].openflag) { sh1sci_isr_siop_out(&(siopcb_table[1])); }}/* * SIO流慨姜位充哈みサ〖ビスル〖チン * * SH1柒垄のSCIでは充哈み戎规が流减慨侍、チャネル侍に尸かれているので、 * SCI1の流慨充哈み笆嘲でこのル〖チンが钙ばれることはない * */voidsh1sci2_isr_tend(void){ if (siopcb_table[1].openflag) { sh1sci_isr_siop_tend(&(siopcb_table[1])); }}/* * SIO减慨充哈みサ〖ビスル〖チン * * SH1柒垄のSCIでは充哈み戎规が流减慨侍、チャネル侍に尸かれているので、 * SCI0の减慨充哈み笆嘲でこのル〖チンが钙ばれることはない * */voidsh1sci2_isr_in(void){ if (siopcb_table[1].openflag) { sh1sci_isr_siop_in(&(siopcb_table[1])); }}/* * SIO减慨エラ〖充哈みサ〖ビスル〖チン * * SH1柒垄のSCIでは充哈み戎规がチャネル侍に尸かれているので、 * SCI0の减慨エラ〖充哈み笆嘲でこのル〖チンが钙ばれることはない * * エラ〖借妄极挛はエラ〖フラグのクリアのみにとどめている。 * ˇオ〖バ〖ランエラ〖 * ˇフレ〖ミングエラ〖 * ˇパリティエラ〖 */voidsh1sci2_isr_error(void){ VB ssr1; if (siopcb_table[1].openflag) { ssr1 = sil_reb_mem(SCI_SSR1); /* 1刨粕み叫して */ ssr1 &= ~(SSR_RDRF | SSR_ORER | SSR_FER | SSR_PER); sil_wrb_mem(SCI_SSR1, ssr1); /* エラ〖フラグクリア */ }}/* * ポ〖リングによる矢机の流慨 */voidsh1sci2_putc_pol(char c){ while(!sh1sci_putready(&siopcb_table[1])); sh1sci_putchar(&siopcb_table[1], c);}#endif /* TNUM_SIOP = 2 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -