NANO100_BSP V3.04.002
The Board Support Package for Nano100BN Series
NuEdu-Basic01_IrDA_NEC.c
Go to the documentation of this file.
1/**************************************************************************/
12#include <stdio.h>
13#include "Nano100Series.h"
15
16
31volatile uint8_t IR_State = 0; // IR State
32volatile uint8_t IR_LDC_Ready = 0; // LeaDer Code is Ready
33volatile uint8_t IR_CTC_Ready = 0; // CusTomer Code is Ready
34volatile uint8_t IR_CTC0 = 0; // Received CusTomer Code 0
35volatile uint8_t IR_CTC1 = 0; // Received CusTomer Code 1
36volatile uint8_t IR_DAC = 0; // Received Data Code
37volatile uint8_t IR_DAB = 0; // Received Data Bar code
38volatile uint8_t IR_cnt = 0;
39volatile uint8_t IR_CODE[4] = {0x00, 0x00, 0x00, 0x00};
40IrDA_Code_Exe g_pfnIrDA_Code_Exe;
42
48void IrDa_NEC_Rx(uint32_t u32Time)
49{
50 if(IR_State == 0)
51 {
52 IR_LDC_Ready = 0; // Clear LeaDer Code Ready
53 IR_CTC_Ready = 0; // Clear CusTomer Code Ready
54 IR_State++;
55 }
56 // Leader or Repeater code
57 else if(IR_State == 1)
58 {
59 // Leader code
60 if((u32Time >= IR_LDC_MIN) && (u32Time <= IR_LDC_MAX))
61 {
62 IR_LDC_Ready = 1; // Set LeaDer Code Ready
63 IR_State++;
64 }
65 else
66 {
67 IR_State = 1;
68 IR_LDC_Ready = 0; // Clear LeaDer Code Ready
69 IR_CTC_Ready = 0; // Clear CusTomer Code Ready
70 }
71 }
72 // Customer code 0
73 else if((IR_State >= 2 && IR_State < 10) && (IR_LDC_Ready == 1))
74 {
75 IR_State++;
76 IR_CTC0 = IR_CTC0 >> 1;
77 if((u32Time >= IR_BIT_0_MIN) && (u32Time <= IR_BIT_0_MAX)) // 1.12ms = 0
78 IR_CTC0 &= 0x7f;
79 else if((u32Time >= IR_BIT_1_MIN) && (u32Time <= IR_BIT_1_MAX)) // 2.25ms = 1
80 IR_CTC0 |= 0x80;
81 else
82 IR_State = 0;
83 }
84 // Customer code 1
85 else if((IR_State >= 10 && IR_State < 18) && (IR_LDC_Ready == 1))
86 {
87 IR_State++;
88 IR_CTC1 = IR_CTC1 >> 1;
89 if((u32Time >= IR_BIT_0_MIN) && (u32Time <= IR_BIT_0_MAX)) // 1.12ms = 0
90 IR_CTC1 &= 0x7f;
91 else if((u32Time >= IR_BIT_1_MIN) && (u32Time <= IR_BIT_1_MAX)) // 2.25ms = 1
92 IR_CTC1 |= 0x80;
93 else
94 IR_State = 0;
95 }
96 // Data
97 else if((IR_State >= 18 && IR_State < 26) && (IR_LDC_Ready == 1))
98 {
99 IR_State++;
100 IR_DAC = IR_DAC >> 1;
101 if((u32Time >= IR_BIT_0_MIN) && (u32Time <= IR_BIT_0_MAX)) // 1.12ms = 0
102 IR_DAC &= 0x7f;
103 else if((u32Time >= IR_BIT_1_MIN) && (u32Time <= IR_BIT_1_MAX)) // 2.25ms = 1
104 IR_DAC |= 0x80;
105 else
106 IR_State = 0;
107
108 }
109 // Data bar
110 else if((IR_State >= 26 && IR_State < 34) && (IR_LDC_Ready == 1))
111 {
112 IR_State++;
113 IR_DAB = IR_DAB >> 1;
114 if((u32Time >= IR_BIT_0_MIN) && (u32Time <= IR_BIT_0_MAX)) // 1.12ms = 0
115 IR_DAB &= 0x7f;
116 else if((u32Time >= IR_BIT_1_MIN) && (u32Time <= IR_BIT_1_MAX)) // 2.25ms = 1
117 IR_DAB |= 0x80;
118 else
119 IR_State = 0;
120
121 if(IR_State == 34)
122 {
123 if((IR_DAC ^ IR_DAB) == 0xff)
124 {
125 IR_LDC_Ready = 0; // Clear LeaDer Code Ready
126 IR_CODE[0] = IR_CTC0;
127 IR_CODE[1] = IR_CTC1;
128 IR_CODE[2] = IR_DAC;
129 IR_CODE[3] = IR_DAB;
130 IR_cnt++;
131 g_pfnIrDA_Code_Exe(IR_CODE);
132 printf("IR_cnt=%d, CTC0=%02x, CTC1=%02x, DAC=%02x, DAB=%02x\n", IR_cnt, IR_CTC0, IR_CTC1, IR_DAC, IR_DAB);
133 }
134 IR_State = 0;
135 }
136 }
137}
138
139#define NEC_LDC_MARK 16 // 16 x 560us = 8960us = 9ms
140#define NEC_LDC_SPACE 8 // 8 x 560us = 4480us = 4.5ms
141#define NEC_BIT_MARK 1 // 560us
142#define NEC_ONE_SPACE 3 // 3 x 560us = 1680us = 1690us
143#define NEC_ZERO_SPACE 1 // 560us
144#define NEC_BYTES 4
145
152void Mark(uint8_t N)
153{
154 /* Switch to PWM output waveform */
156 CLK_SysTickDelay(560*N);
158}
164void SPACE(uint8_t N)
165{
166 CLK_SysTickDelay(560*N);
167}
168
174void SendNEC(uint8_t* data)
175{
176 uint8_t nbyte;
177 uint8_t nbit;
178
179 /* Send out Leader code */
182
183 /* Send out Customer code and Data code */
184 for (nbyte=0; nbyte < NEC_BYTES; nbyte++)
185 {
186 for (nbit=0; nbit < 8; nbit++)
187 {
189 if (data[nbyte] & (1 << nbit)) // LSB first
191 else
193 }
194 }
195
196 /* Send out Stop bit */
198
199}
200
206void IrDA_NEC_TxRx_Init(IrDA_Code_Exe pfnIrDA_Code_Exe)
207{
208 g_pfnIrDA_Code_Exe = pfnIrDA_Code_Exe;
209
212
214
215 PWM1->CTL |= (PWM_CTL_CH3MOD_Msk|PWM_CTL_CH2MOD_Msk); //Set PWM1_CH3 is Continuous Mode
216 PWM_SET_DIVIDER(PWM1, 2, PWM_CLK_DIV_1); //Set PWM1_CH2 Clock Source Divider
217 PWM_SET_DIVIDER(PWM1, 3, PWM_CLK_DIV_4); //Set PWM1_CH3 Clock Source Divider
218 PWM_SET_PRESCALER(PWM1, 3, 2); //Set PWM1_CH2 and PWM1_CH3 Prescaler
219 PWM_SET_CNR(PWM1, 3, MaxValue);
220 PWM_SET_CNR(PWM1, 2, ((120000000/3/38000+5)/10));
221 PWM_SET_CMR(PWM1, 2, ((120000000/3/38000+5)/10)/2);
222
223 //Start Capture
227 NVIC_EnableIRQ(PWM1_IRQn);
229}
230 /* end of group Nano130_Basic01_FUNCTIONS IrDA NEC Exported Functions */
232 /* end of group NuEdu-SDK-Nano130_Basic01 Nano130_Basic01 Library */
234 /* end of group NANO100_Library NANO100 Library */
236
237/*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/
Nano100 series peripheral access layer header file. This file contains all the peripheral register's ...
#define PWM_CTL_CH2MOD_Msk
#define PWM_CTL_CH3MOD_Msk
#define PWM_CAPCTL_CAPRELOADFEN3_Msk
NuEdu-Basic01 IrDA NEC driver header file.
#define PWM1_CH23_MODULE
Definition: clk.h:307
#define CLK_CLKSEL2_PWM1_CH23_S_HIRC
Definition: clk.h:180
void CLK_EnableModuleClock(uint32_t u32ModuleIdx)
This function enable module clock.
Definition: clk.c:436
int32_t CLK_SysTickDelay(uint32_t us)
This function execute delay function.
Definition: clk.c:560
void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv)
This function set selected module clock source and module clock divider.
Definition: clk.c:339
@ PWM1_IRQn
Definition: Nano100Series.h:97
#define PWM1
Pointer to PWM1 register structure.
#define SYS
Pointer to SYS register structure.
#define PWM_CH_3_MASK
Definition: pwm.h:40
#define PWM_CH_2_MASK
Definition: pwm.h:39
#define PWM_FALLING_LATCH_INT_ENABLE
Definition: pwm.h:49
#define PWM_CLK_DIV_1
Definition: pwm.h:41
#define PWM_CLK_DIV_4
Definition: pwm.h:43
void PWM_EnableCapture(PWM_T *pwm, uint32_t u32ChannelMask)
This function enables PWM capture of selected channels.
Definition: pwm.c:285
#define PWM_SET_DIVIDER(pwm, u32ChannelNum, u32Divider)
This macro set the divider of the selected channel.
Definition: pwm.h:131
#define PWM_SET_CMR(pwm, u32ChannelNum, u32CMR)
This macro set the duty of the selected channel.
Definition: pwm.h:143
#define PWM_SET_CNR(pwm, u32ChannelNum, u32CNR)
This macro set the period of the selected channel.
Definition: pwm.h:159
void PWM_DisableOutput(PWM_T *pwm, uint32_t u32ChannelMask)
This function disables PWM output generation of selected channels.
Definition: pwm.c:346
#define PWM_SET_PRESCALER(pwm, u32ChannelNum, u32Prescaler)
This macro set the prescaler of the selected channel.
Definition: pwm.h:115
void PWM_Start(PWM_T *pwm, uint32_t u32ChannelMask)
This function start PWM module.
Definition: pwm.c:227
void PWM_EnableOutput(PWM_T *pwm, uint32_t u32ChannelMask)
This function enables PWM output generation of selected channels.
Definition: pwm.c:334
void PWM_EnableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge)
This function enable capture interrupt of selected channel.
Definition: pwm.c:393
#define SYS_PC_H_MFP_PC15_MFP_PWM1_CH2
Definition: sys.h:375
#define SYS_PC_H_MFP_PC14_MFP_PWM1_CH3
Definition: sys.h:381
#define NEC_BIT_MARK
#define NEC_ONE_SPACE
void IrDa_NEC_Rx(uint32_t u32Time)
This function is used to detect NEC IR procotol.
#define NEC_ZERO_SPACE
#define NEC_LDC_SPACE
void IrDA_NEC_TxRx_Init(IrDA_Code_Exe pfnIrDA_Code_Exe)
This function is used to initiate PWM for IrDA NEC.
#define NEC_BYTES
void SendNEC(uint8_t *data)
This function is used to transmit IrDA NEC waveform through PC 15 (PWM1_CH3)
void SPACE(uint8_t N)
This function is used to transmit SPACE waveform.
void(* IrDA_Code_Exe)(volatile uint8_t *IR_CODE)
void Mark(uint8_t N)
This function is used to transmit MASK waveform Pulse = 1/3 duty @38KHz frequency.
#define NEC_LDC_MARK