Forum: Mikrocontroller und Digitale Elektronik UART mit XMC2GO


von Alex (Gast)


Lesenswert?

Ich würde gerne ein GSM-Modul am XMC verwenden ,leider finde ich keinen 
Weg es über UART anzuschließen, da ja Pin 2.1 und 2.2 nicht auf der 
Stiftleiste vorhanden sind.

Gibt es eine Möglichkeit das trotzdem zu machen ?

Danke schonmal :)

von JochenZ (Gast)


Angehängte Dateien:

Lesenswert?

ja klar kannst du das trotzdem machen siehe Bild im Anhang ;-)
hab mit Sisy einfach mal laut Datenblatt das template Usic1 Channel0 an 
P0.6/P0.7 angehängt und es funzt sofort :D, den Init-Code must dir 
selber raus popeln :-P
1
//////////////////////////////////////////////////////
2
//
3
// Diese Quellcodedatei wurde automatisch erzeugt.
4
// SiSy UML CodeGenerierung
5
//
6
//////////////////////////////////////////////////////
7
#define GeneratedBySisy
8
#define cpp_Modem
9
#define SISY_CLASS_NAME Modem
10
#include "Modem.h"
11
#include "Controller.h"
12
13
#define uartNoTx_
14
#define uartNoRx_
15
#define _TheUsic USIC0_CH1
16
extern  Controller* pGlob_app;
17
#define app (*pGlob_app)
18
19
/////////////////////////////
20
Modem::Modem()
21
{
22
  //  aus Template: PecUart
23
  // init
24
  init();
25
  // config
26
  #define noBaudrate9600
27
  #ifndef noBaudrate
28
    config(9600);
29
  #endif
30
}
31
/////////////////////////////
32
void Modem::config(uint32_t baudrate, uint8_t dataBits, UartParity parity, UartStopBits stopBits)
33
{
34
  //  aus Template: SysUartXmc    GoToSiSy:o:953|zBase:1
35
  // Disable clock gating to USICn
36
  #if UC_FAMILY == XMC1
37
    //SCU_UnlockProtectedBits();  // only for 32 clocks
38
    SCU_GENERAL->PASSWD = 0x000000C0UL; // disable bit protection
39
    
40
    //SCU_CLK->CGATCLR0 |= SCU_CLK_CGATCLR0_USIC0_Msk;
41
    SCU_CLOCK_UngateClock( SCU_CLOCK_ID_USIC0 );
42
    
43
    //SCU_LockProtectedBits();
44
    SCU_GENERAL->PASSWD = 0x000000C3UL; // enable bit protection
45
  #endif
46
  // für XMC4
47
  #if UC_FAMILY == XMC4
48
    SCU_RESET_ClearResetRequest( SCU_RESET_REQUEST_SOURCE_USIC0 ); 
49
  #endif
50
  
51
  /* Enable the module kernel clock and the module functionality  */
52
  _TheUsic->KSCFG |= USIC_CH_KSCFG_MODEN_Msk | USIC_CH_KSCFG_BPMODEN_Msk;
53
  
54
  ////// Baudrate //////
55
  uint32_t pdiv1 = 1023;    // PDIV = Divider Mode: Divider Factor to Generate, max 10 bit
56
  uint32_t dctq1 = 16;    // DCTQ = Denominator for Time Quanta Counter, max 5 bit
57
  uint32_t pctq1 = 1;      // PCTQ = Pre-Divider for Time Quanta Counter, max 2 bit
58
  if(baudrate>100000)
59
    dctq1 = 4;
60
  
61
  uint32_t br1=0;
62
  while(pdiv1>2 && br1<baudrate)
63
  {
64
    pdiv1--;
65
    br1 = SystemCoreClock / (pdiv1*dctq1*pctq1);
66
  }
67
  uint32_t fdrStep;  // FDR.STEP = Fractional Divider Register - Step Value, max 10 bit
68
  fdrStep = 1024*baudrate/br1;
69
  
70
  /* FDR.DM = 02b (Fractional divider mode) */
71
  uint32_t dm = 0x02;    // Fractional divider mode selected
72
  if( br1==baudrate )
73
  {
74
    dm = 0x01;      // Normal divider mode selected.
75
    fdrStep = 0x3FF;
76
  }
77
  WR_REG(_TheUsic->FDR, USIC_CH_FDR_DM_Msk, USIC_CH_FDR_DM_Pos, dm);
78
  WR_REG(_TheUsic->FDR, USIC_CH_FDR_STEP_Msk, USIC_CH_FDR_STEP_Pos, fdrStep);
79
  
80
  /* Configure baud rate generator */
81
  /* BAUDRATE = fCTQIN/(BRG.PCTQ x BRG.DCTQ) */
82
  /* CLKSEL = 0 (fPIN = fFD), CTQSEL = 00b (fCTQIN = fPDIV), PPPEN = 0 (fPPP=fPIN) */
83
  uint32_t brg = 0;
84
  brg |= (pdiv1-1)<<USIC_CH_BRG_PDIV_Pos;
85
  brg |= (dctq1-1)<<USIC_CH_BRG_DCTQ_Pos;
86
  brg |= (pctq1-1)<<USIC_CH_BRG_PCTQ_Pos;
87
  WR_REG(_TheUsic->BRG
88
    ,USIC_CH_BRG_PCTQ_Msk | USIC_CH_BRG_DCTQ_Msk | USIC_CH_BRG_PDIV_Msk | USIC_CH_BRG_CLKSEL_Msk | USIC_CH_BRG_PPPEN_Msk | USIC_CH_BRG_CTQSEL_Msk
89
    ,0
90
    ,brg
91
    );
92
  
93
  
94
  
95
  /* Configuration of USIC Shift Control */
96
    /* SCTR.FLE = 8 (Frame Length) */
97
    /* SCTR.WLE = 8 (Word Length) */
98
    /* SCTR.TRM = 1 (Transmission Mode) */
99
    /* SCTR.PDL = 1 (This bit defines the output level at the shift data output signal when no data is available for transmission) */
100
  _TheUsic->SCTR &= ~(USIC_CH_SCTR_TRM_Msk | USIC_CH_SCTR_PDL_Msk);
101
  _TheUsic->SCTR |= (0x01UL << USIC_CH_SCTR_PDL_Pos) | (0x01UL << USIC_CH_SCTR_TRM_Pos);
102
  // Databits
103
  WR_REG( _TheUsic->SCTR, USIC_CH_SCTR_FLE_Msk, USIC_CH_SCTR_FLE_Pos, (dataBits-1) );
104
  WR_REG( _TheUsic->SCTR, USIC_CH_SCTR_WLE_Msk, USIC_CH_SCTR_WLE_Pos, (dataBits-1) );
105
  
106
  /* Configuration of USIC Transmit Control/Status Register */
107
  /* TBUF.TDEN = 1 (TBUF Data Enable: A transmission of the data word in TBUF can be started if TDV = 1 */
108
  /* TBUF.TDSSM = 1 (Data Single Shot Mode: allow word-by-word data transmission which avoid sending the same data several times*/
109
  _TheUsic->TCSR &= ~(USIC_CH_TCSR_TDEN_Msk);
110
  _TheUsic->TCSR |= USIC_CH_TCSR_TDSSM_Msk | (0x01UL << USIC_CH_TCSR_TDEN_Pos);
111
  
112
  /* Configuration of Protocol Control Register */
113
    /* PCR.SMD = 1 (Sample Mode based on majority) */
114
    /* PCR.STPB = 0 (1x Stop bit) */
115
    /* PCR.SP = <dctq (Sample Point) */
116
    /* PCR.PL = 0 (Pulse Length is equal to the bit length) */
117
  _TheUsic->PCR &= ~(USIC_CH_PCR_ASCMode_SP_Msk | USIC_CH_PCR_ASCMode_PL_Msk);
118
  _TheUsic->PCR |= USIC_CH_PCR_ASCMode_SMD_Msk | ((dctq1/2) << USIC_CH_PCR_ASCMode_SP_Pos);
119
  // StopBits
120
  WR_REG(_TheUsic->PCR, USIC_CH_PCR_ASCMode_STPB_Msk, USIC_CH_PCR_ASCMode_STPB_Pos, stopBits);
121
  
122
  /* ----- Configure Transmit Buffer ----- */
123
  /* Standard transmit buffer event is enabled */
124
  /* Define start entry of Transmit Data FIFO buffer DPTR = 0*/
125
  _TheUsic->TBCTR &= ~(USIC_CH_TBCTR_SIZE_Msk | USIC_CH_TBCTR_DPTR_Msk);
126
  
127
  /* Set Transmit Data Buffer to 64 */
128
  _TheUsic->TBCTR |= 0x06UL << USIC_CH_TBCTR_SIZE_Pos;
129
  
130
  /* Configure Receive Buffer */
131
  /* Standard receive buffer event is enabled */
132
  /* Define start entry of Receive Data FIFO buffer DPTR = 0*/
133
  _TheUsic->RBCTR &= ~(USIC_CH_RBCTR_SIZE_Msk | USIC_CH_RBCTR_DPTR_Msk);
134
  
135
  /* Set Receive Data Buffer to 64 */
136
  _TheUsic->RBCTR |= 0x06UL << USIC_CH_RBCTR_SIZE_Pos;
137
  
138
  /* ----- Initialize UART_RX (DX0) -----*/
139
  /* Pin as input */
140
  {
141
    SysGpio gpio;
142
    gpio.init(PORT0, BIT6);
143
    gpio.setMode(PCx_Input);
144
  }
145
  /* Select Pin as input for USIC */
146
  WR_REG( _TheUsic->DX0CR, USIC_CH_DX0CR_DSEL_Msk, USIC_CH_DX0CR_DSEL_Pos, UsicSelDXnC);
147
  
148
  /* ----- Initialize UART_TX (DOUT) -----*/
149
  /* Pin as output controlled by ALT7 = U0C1.DOUT0 */
150
  {
151
    SysGpio gpio;
152
    gpio.init(PORT0, BIT7);
153
    gpio.setMode(PCx_AF7);
154
  }
155
  
156
  /* Configuration of Channel Control Register */
157
  /* CCR.PM = 00 ( Disable parity generation) */
158
  /* CCR.MODE = 2 (ASC mode enabled. Note: 0 (USIC channel is disabled)) */
159
  
160
  // Parity
161
  WR_REG( _TheUsic->CCR, USIC_CH_CCR_PM_Msk, USIC_CH_CCR_PM_Pos, parity );
162
  // Uart-Mode
163
  WR_REG( _TheUsic->CCR, USIC_CH_CCR_MODE_Msk, USIC_CH_CCR_MODE_Pos, 0x02UL );
164
  
165
  // GoToSiSy:d:2477|o:2488|zbase:132
166
167
}

Gruß J.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.