08 ARM SAM4 – Komunikacja USB->RS232->UART

Aby mieć możliwość podglądu danych z mikrokontrolera zajmiemy się wprowadzeniem możliwości jego komunikacji z komputerem PC za pomocą przejściówki USB->RS232 opartej na układzie PL2303. Poniżej zdjęcie poglądowe urządzenia.

Układ jest wyposażony w dwie linie transmisji RX oraz TX, które należy podłączyć do odpowiedniego portu szeregowego układu SAM4. Standardowo wyposażony jest on w dwa układy szeregowe UART0 i UART1. W zestawie uruchomieniowym SAM4S XPlained na wyjścia wyprowadzony jest UART1, który posiada przypisane linie transmisji do następujących pinów. Pin PB2 to linia RX, a pin PB3 to linia TX. Piny te znajdują się na złączy J1 na płytce testowej. Poniżej przedstawiono schemat podłączenia.

Pin PB2 linia RX musi być podłączony do lini TX przejściówki, a pin PB3 TX do lini RX. Układ podpisany do komputera, płyta prototypowa również musi być podłączona do komputera za pomocą kabla zasilającego USB, aby zapewnić jej zasilanie.

Teraz przechodzimy do menadżera urządzeń w systemie Windows aby sprawdzić czy mamy zainstalowany prawidłowy sterownik. Po podłączeniu powinniśmy zobaczy nowy port COM, lub nierozpoznane urządzenie.

Aby podłączyć prawidłowo urządzenie musimy zainstalować odpowiedni sterownik.

 

#include „sam4s16c.h”

#include „stdio.h”

#include „stdlib.h”

#include „string.h”

 

#define LEDA (1<<10)

#define LEDB (1<<17)

 

#define LEDA_on PIOC->PIO_SODR = LEDA

 

#define LEDA_off PIOC->PIO_CODR = LEDA

 

#define UART_PIO        PIOB

#define UART_RX_PIN     PIO_PB2

#define UART_TX_PIN     PIO_PB3

#define UART            UART1

#define UART_PID        ID_UART1

#define UART_IRQn       UART1_IRQn

#define UART_SPEED      (9600ul)

 

#define __SYSTEM_CLOCK_4MHZ  (4000000UL)

#define __SYSTEM_CLOCK_120MHZ (120000000UL)

 

 

 

static uint8_t stan_rs232=0;

 

static uint32_t licznik = 0;

 

static char auc_String[20] = „test!\r\n”;

 

static char* puc_String = (char*)auc_String ;

 

static void hardware_init( void )

{

 

 

 

// Configure UART

PMC->PMC_PCER0 = (1 << UART_PID) ;

// Assign UART pins to UART

UART_PIO->PIO_ABCDSR[0] &= ~(UART_RX_PIN | UART_TX_PIN) ;

UART_PIO->PIO_ABCDSR[1] &= ~(UART_RX_PIN | UART_TX_PIN) ;

UART_PIO->PIO_PDR       = (UART_RX_PIN | UART_TX_PIN) ;

// Configure UART baudrate generator

UART->UART_BRGR = SystemCoreClock / (UART_SPEED * 16) ;

// Configure UART parity

UART->UART_MR = UART_MR_PAR_NO ;

// Enable UART TX + RX

UART->UART_CR = UART_CR_TXEN | UART_CR_RXEN ;

// Enable UART interrupt

UART->UART_IER = UART_IER_RXRDY ;

 

}

 

void send_string(char tekst[20] )

{

if (stan_rs232 == 0)

{

 

strcpy(auc_String,tekst);

stan_rs232 = 1;

}

 

 

if ( (UART->UART_SR & UART_SR_TXRDY) == UART_SR_TXRDY )

{

 

UART->UART_THR = *puc_String ;

puc_String++ ;

 

// Detect end of string, then reset pointer to start

if ( *puc_String == ‚\0’ )

{

puc_String = (char*)auc_String ;

stan_rs232 = 0;

 

 

 

}

 

}

}

 

void UART0_Handler( void )

{

volatile uint32_t uc_rx ;

 

if ( (UART->UART_SR & UART_SR_RXRDY) == UART_SR_RXRDY )

{

uc_rx = UART->UART_RHR ;

 

 

if ( (UART->UART_SR & UART_SR_TXRDY) == UART_SR_TXRDY )

{

UART->UART_THR = uc_rx ;

}

}

}

 

void SysTick_Handler( void )

{

if (stan_rs232 == 1)

{

send_string(„0”);

}

}

 

int main(void)

{

/* Initialize the SAM system */

 

 

// Uruchomienie nóżek od LCD

 

SystemInit();

hardware_init() ;

 

WDT->WDT_MR=WDT_MR_WDDIS;  // Wyłączenie funkcji watchdog

PIOC->PIO_PER = (LEDA | LEDB); // Uruchomienie rejestru PIOC

PIOC->PIO_OER = (LEDA | LEDB); // Ustawia rejestr C jako wyjście

PIOC->PIO_PUDR = (LEDA | LEDB); // Wyłącza rezystroy podciągające

 

PIOC->PIO_SODR = LEDA;

PIOC->PIO_CODR = LEDB;

SysTick_Config( SystemCoreClock/100UL ) ;

NVIC_EnableIRQ( SysTick_IRQn ) ;

 

send_string(„Kwiatkowski Dawid\r\n”);

 

for(uint32_t i=0; i<200000;i++) { }

 

 

 

while (1)

{

 

PIOC->PIO_SODR = LEDA;

PIOC->PIO_CODR = LEDB;

for(uint32_t i=0; i<400000;i++) { }

send_string(„\r\n”);

 

 

 

 

PIOC->PIO_SODR = LEDB;

PIOC->PIO_CODR = LEDA;

for(uint32_t i=0; i<400000;i++)  {}

int a = licznik ;

char arr[10] =”” ;

 

itoa(a,arr,10) ;

send_string(arr);

licznik++;

 

 

}

}