実現したいこと
- C言語での通信方法とデータ処理についてのイメージを確立させたい
- 関数を使いこなせるようになりたい
- データの取得について処理の具体例が知りたい
前提
現在RX64Mマイコンを使用し、e2studioにてプログラムを書いています。
スマートコンフィグレータを使用してのコード生成を行っています。
SCIF9を使用してRS232Cの通信を使用と考えているのですが、下記の壁にぶつかっています。
<受信データを取得するためにどういった手順を踏めばよいか>
APIのリファレンスマニュアルや、ハードウェアマニュアルでのレジスタの確認をしながら、生成されたコードを読み、通信の開始/停止用の関数などの仕様を確認しています。なんとなくですが、コード生成されたものがハードウェアマニュアルマニュアル記載のレジスタの設定を行っていることや、関数呼び出しで通信が開始されることは理解できたのですが、いざプログラムを書こうにも、何からすればよいのか分からなくなってきました。
キャラクタ同期をしようと思っているので、
①通信開始の関数を呼び出し通信可能状態にする
②受信開始の関数
MD_STATUS R_<Config_SCI0>_Serial_Receive ( uint8_t * const rx_buf, uint16_t rx_num );
[引数]
uint8_t * const rx_buf; 受信したデータを格納するバッファへのポインタ
uint16_t rx_num; 受信するデータの総数
[戻り値]
MD_OK 正常終了
MD_ARGERROR 引数 rx_num の指定が不正
に自分で指定した受信データを格納したい変数のポインタと予定されているデータ数を引き渡す。
③変数に格納された値を読み、キャラクタ同期のスタート制御文字ならそのまま値を読み込み
のような感じで考えているのですが、どういったことに気を使わなくてはいけないのか、ご教授いただければと思います。
以下、コード生成したソースを参考に添付します。
C言語
1//Config_SCIF9.c 2#include "r_cg_macrodriver.h" 3#include "Config_SCIF9.h" 4#include "r_cg_userdefine.h" 5 6volatile uint8_t * gp_scifa9_tx_address; /* SCIFA9 transmit buffer address */ 7volatile uint16_t g_scifa9_tx_count; /* SCIFA9 transmit data number */ 8volatile uint8_t * gp_scifa9_rx_address; /* SCIFA9 receive buffer address */ 9volatile uint16_t g_scifa9_rx_count; /* SCIFA9 receive data number */ 10volatile uint16_t g_scifa9_rx_length; /* SCIFA9 receive data length */ 11 12void R_Config_SCIF9_Create(void) 13{ 14 volatile uint16_t dummy; 15 uint32_t w_count; 16 17 /* Cancel SCIFA9 module stop state */ 18 MSTP(SCIFA9) = 0U; 19 20 /* Clear transmit/receive enable bits */ 21 SCIFA9.SCR.BIT.TE = 0U; 22 SCIFA9.SCR.BIT.RE = 0U; 23 24 /* Reset transmit/receive FIFO data register operation */ 25 SCIFA9.FCR.BIT.TFRST = 1U; 26 SCIFA9.FCR.BIT.RFRST = 1U; 27 28 /* Read and clear status flags */ 29 dummy = SCIFA9.FSR.WORD; 30 SCIFA9.FSR.WORD = 0x00U; 31 32 dummy = (uint16_t) SCIFA9.LSR.BIT.ORER; 33 SCIFA9.LSR.BIT.ORER = 0U; 34 35 /* Set clock enable bits */ 36 SCIFA9.SCR.WORD = _0000_SCIF_INTERNAL_SCK_UNUSED; 37 38 /* Set transmission/reception format */ 39 SCIFA9.SMR.WORD = _0000_SCIF_CLOCK_PCLK | _0000_SCIF_STOP_1 | _0000_SCIF_PARITY_DISABLE | 40 _0000_SCIF_DATA_LENGTH_8 | _0000_SCIF_ASYNCHRONOUS_MODE; 41 SCIFA9.SEMR.BYTE = _00_SCIF_16_BASE_CLOCK | _00_SCIF_NOISE_FILTER_DISABLE | _00_SCIF_DATA_TRANSFER_LSB_FIRST | 42 _00_SCIF_BAUDRATE_SINGLE; 43 44 /* Clear modulation duty register select */ 45 SCIFA9.SEMR.BIT.MDDRS = 0U; 46 47 /* Set bit rate */ 48 SCIFA9.BRR = 0xC2U; 49 50 /* Wait for at least 1-bit interval */ 51 for (w_count = 0U; w_count <= _000004E0_SCIF_1BIT_INTERVAL; w_count++) 52 { 53 nop(); 54 } 55 56 /* Set FIFO trigger conditions */ 57 SCIFA9.FTCR.WORD = _0000_SCIF_TX_FIFO_TRIGGER_NUM_0 | _0080_SCIF_TX_TRIGGER_TFTC_VALID | 58 _0100_SCIF_RX_FIFO_TRIGGER_NUM_1 | _8000_SCIF_RX_TRIGGER_RFTC_VALID; 59 SCIFA9.FCR.WORD = _0000_SCIF_LOOPBACK_DISABLE | _0000_SCIF_MODEM_CONTROL_DISABLE; 60 61 /* Disable transmit/receive FIFO data register reset operation */ 62 SCIFA9.FCR.BIT.TFRST = 0U; 63 SCIFA9.FCR.BIT.RFRST = 0U; 64 65 /* Set interrupt priority */ 66 IPR(SCIFA9, TXIF9) = _0F_SCIF_PRIORITY_LEVEL15; 67 IPR(SCIFA9, RXIF9) = _0F_SCIF_PRIORITY_LEVEL15; 68 69 /* Set RXD9 pin */ 70 MPC.PB6PFS.BYTE = 0x0AU; 71 PORTB.PMR.BYTE |= 0x40U; 72 73 /* Set TXD9 pin */ 74 MPC.PB7PFS.BYTE = 0x0AU; 75 PORTB.PMR.BYTE |= 0x80U; 76 77 R_Config_SCIF9_Create_UserInit(); 78} 79 80void R_Config_SCIF9_Start(void) 81{ 82 /* Clear interrupt flag */ 83 IR(SCIFA9,TXIF9) = 0U; 84 IR(SCIFA9,RXIF9) = 0U; 85 86 /* Enable SCIF interrupt */ 87 IEN(SCIFA9,TXIF9) = 1U; 88 ICU.GENAL0.BIT.EN4 = 1U; 89 IEN(SCIFA9,RXIF9) = 1U; 90 ICU.GENAL0.BIT.EN5 = 1U; 91 ICU.GENAL0.BIT.EN6 = 1U; 92 ICU.GENAL0.BIT.EN7 = 1U; 93} 94 95void R_Config_SCIF9_Stop(void) 96{ 97 98 /* Disable serial transmit */ 99 SCIFA9.SCR.BIT.TE = 0U; 100 101 /* Disable serial receive */ 102 SCIFA9.SCR.BIT.RE = 0U; 103 104 /* Disable TXI interrupt */ 105 SCIFA9.SCR.BIT.TIE = 0U; 106 107 /* Disable RXI, ERI, BRI and DRI interrupt */ 108 SCIFA9.SCR.BIT.RIE = 0U; 109 IR(SCIFA9,TXIF9) = 0U; 110 IEN(SCIFA9,TXIF9) = 0U; 111 ICU.GENAL0.BIT.EN4 = 0U; 112 IR(SCIFA9,RXIF9) = 0U; 113 IEN(SCIFA9,RXIF9) = 0U; 114 ICU.GENAL0.BIT.EN5 = 0U; 115 ICU.GENAL0.BIT.EN6 = 0U; 116 ICU.GENAL0.BIT.EN7 = 0U; 117} 118 119MD_STATUS R_Config_SCIF9_Serial_Receive(uint8_t * const rx_buf, uint16_t rx_num) 120{ 121 MD_STATUS status = MD_OK; 122 123 if (rx_num < 1U) 124 { 125 status = MD_ARGERROR; 126 } 127 else 128 { 129 g_scifa9_rx_count = 0U; 130 g_scifa9_rx_length = rx_num; 131 gp_scifa9_rx_address = rx_buf; 132 133 SCIFA9.FTCR.BIT.RFTC = _01_SCIF_RX_TRIG_NUM; 134 135 SCIFA9.SCR.BIT.RE = 1U; 136 SCIFA9.SCR.BIT.RIE = 1U; 137 SCIFA9.SCR.BIT.REIE = 1U; 138 } 139 140 return (status); 141} 142 143MD_STATUS R_Config_SCIF9_Serial_Send(uint8_t * const tx_buf, uint16_t tx_num) 144{ 145 MD_STATUS status = MD_OK; 146 147 if (tx_num < 1U) 148 { 149 status = MD_ARGERROR; 150 } 151 else 152 { 153 gp_scifa9_tx_address = tx_buf; 154 g_scifa9_tx_count = tx_num; 155 SCIFA9.SCR.BIT.TE = 1U; 156 SCIFA9.SCR.BIT.TIE = 1U; 157 } 158 159 return (status); 160}
C言語
1//Config_SCIF9_user.c 2#include "r_cg_macrodriver.h" 3#include "Config_SCIF9.h" 4#include "r_cg_userdefine.h" 5 6extern volatile uint8_t * gp_scifa9_tx_address; /* SCIFA9 send buffer address */ 7extern volatile uint16_t g_scifa9_tx_count; /* SCIFA9 send data number */ 8extern volatile uint8_t * gp_scifa9_rx_address; /* SCIFA9 receive buffer address */ 9extern volatile uint16_t g_scifa9_rx_count; /* SCIFA9 receive data number */ 10extern volatile uint16_t g_scifa9_rx_length; /* SCIFA9 receive data length */ 11 12void R_Config_SCIF9_Create_UserInit(void) 13{ 14 /* Start user code for user init. Do not edit comment generated here */ 15 /* End user code. Do not edit comment generated here */ 16} 17 18#if FAST_INTERRUPT_VECTOR == VECT_SCIFA9_TXIF9 19#pragma interrupt r_Config_SCIF9_txif_interrupt(vect=VECT(SCIFA9,TXIF9),fint) 20#else 21#pragma interrupt r_Config_SCIF9_txif_interrupt(vect=VECT(SCIFA9,TXIF9)) 22#endif 23static void r_Config_SCIF9_txif_interrupt(void) 24{ 25 uint16_t count = 0; 26 27 /* Get the amount of untransmitted data stored in the FRDR register */ 28 uint16_t dummy_fdr = SCIFA9.FDR.BIT.T; 29 30 /* Write data to the transmit FIFO data register */ 31 while ((0U < g_scifa9_tx_count) && (count < (_10_SCIF_FIFO_MAX_SIZE - dummy_fdr))) 32 { 33 SCIFA9.FTDR = *gp_scifa9_tx_address; 34 gp_scifa9_tx_address++; 35 g_scifa9_tx_count--; 36 count++; 37 } 38 39 if (1U == SCIFA9.FSR.BIT.TDFE) 40 { 41 SCIFA9.FSR.BIT.TDFE = 0U; 42 } 43 44 if (0U >= g_scifa9_tx_count) 45 { 46 SCIFA9.SCR.BIT.TIE = 0U; 47 SCIFA9.SCR.BIT.TEIE = 1U; 48 } 49} 50 51void r_Config_SCIF9_teif_interrupt(void) 52{ 53 if (1U == SCIFA9.FSR.BIT.TEND) 54 { 55 SCIFA9.SCR.BIT.TE = 0U; 56 SCIFA9.SCR.BIT.TEIE = 0U; 57 } 58 59 r_Config_SCIF9_callback_transmitend(); 60} 61 62#if FAST_INTERRUPT_VECTOR == VECT_SCIFA9_RXIF9 63#pragma interrupt r_Config_SCIF9_rxif_interrupt(vect=VECT(SCIFA9,RXIF9),fint) 64#else 65#pragma interrupt r_Config_SCIF9_rxif_interrupt(vect=VECT(SCIFA9,RXIF9)) 66#endif 67static void r_Config_SCIF9_rxif_interrupt(void) 68{ 69 uint16_t count = 0; 70 71 /* Get the amount of receive data stored in FRDR register */ 72 uint16_t dummy_fdr = SCIFA9.FDR.BIT.R; 73 74 /* Read data from the receive FIFO data register */ 75 while ((g_scifa9_rx_length > g_scifa9_rx_count) && (count < dummy_fdr)) 76 { 77 *gp_scifa9_rx_address = SCIFA9.FRDR; 78 gp_scifa9_rx_address++; 79 g_scifa9_rx_count++; 80 count++; 81 } 82 83 /* If remaining data is less than the receive trigger number, receive interrupt will not occur. 84 In this case, set trigger number to 1 to force receive interrupt for each one byte of data in FRDR */ 85 if ((_01_SCIF_RX_TRIG_NUM > (g_scifa9_rx_length - g_scifa9_rx_count)) && (1U != SCIFA9.FTCR.BIT.RFTC)) 86 { 87 SCIFA9.FTCR.BIT.RFTC = 1U; 88 } 89 90 /* Clear receive FIFO data full flag */ 91 if (1U == SCIFA9.FSR.BIT.RDF) 92 { 93 SCIFA9.FSR.BIT.RDF = 0U; 94 } 95 96 if (g_scifa9_rx_length <= g_scifa9_rx_count) 97 { 98 /* All data received */ 99 SCIFA9.SCR.BIT.RE = 0U; 100 101 r_Config_SCIF9_callback_receiveend(); 102 } 103} 104 105void r_Config_SCIF9_erif_interrupt(void) 106{ 107 if (1U == SCIFA9.FSR.BIT.ER) 108 { 109 r_Config_SCIF9_callback_error(RECEIVE_ERROR); 110 /* clear receive error flag */ 111 SCIFA9.FSR.BIT.ER = 0U; 112 } 113} 114 115void r_Config_SCIF9_brif_interrupt(void) 116{ 117 if (1U == SCIFA9.LSR.BIT.ORER) 118 { 119 r_Config_SCIF9_callback_error(OVERRUN_ERROR); 120 /* clear overrun error flag */ 121 SCIFA9.LSR.BIT.ORER = 0U; 122 } 123 124 if (1U == SCIFA9.FSR.BIT.BRK) 125 { 126 r_Config_SCIF9_callback_error(BREAK_DETECT); 127 /* clear break detect flag */ 128 SCIFA9.FSR.BIT.BRK = 0U; 129 } 130} 131 132void r_Config_SCIF9_drif_interrupt(void) 133{ 134 /* Start user code for r_Config_SCIF9_drif_interrupt. Do not edit comment generated here */ 135 /* End user code. Do not edit comment generated here */ 136} 137 138static void r_Config_SCIF9_callback_transmitend(void) 139{ 140 /* Start user code for r_Config_SCIF9_callback_transmitend. Do not edit comment generated here */ 141 /* End user code. Do not edit comment generated here */ 142} 143 144static void r_Config_SCIF9_callback_receiveend(void) 145{ 146 /* Start user code for r_Config_SCIF9_callback_receiveend. Do not edit comment generated here */ 147 /* End user code. Do not edit comment generated here */ 148} 149 150static void r_Config_SCIF9_callback_error(scif_error_type_t error_type) 151{ 152 /* Start user code for r_Config_SCIF9_callback_error. Do not edit comment generated here */ 153 /* End user code. Do not edit comment generated here */ 154} 155 156
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/09/07 23:09
2023/09/08 01:29
2023/09/08 02:59
2023/09/08 08:44
2023/09/12 10:00
2023/09/26 05:19 編集
2023/09/26 05:18
2023/09/26 23:47
2023/09/26 23:50
2023/09/27 01:15
2023/09/27 05:04
2023/09/27 22:39
2023/09/29 07:48
2023/09/29 22:06
2023/10/01 23:37