[FreeScale]/KINETIS2013. 11. 3. 22:00

K20 EVM - SPI 테스트 3축 가속도 센서값을 TFT LCD 그래프로 표시하기

K20 EVM - SPI 테스트 3축 가속도 센서값을 TFT LCD 그래프로 표시하기



SPI 를 쉽고 재미 있게 테스트하기 위해 가속도 센서를 활용할 수 있다. LIS3LV02 3축 가속도 센서를 SPI모드로 설정하고 확장 EVM보드에 연결하여 테스트 할 수 있다. 

SPI 방식으로 센서를 설정하거나 3축 가속도 센서값을 읽을 수 있다.



K20 SPI모드 가속도 센서 테스트 동영상




K20 가속도 센서 테스트 드라이버 코드
//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE 1
#define MY_ACCEL3LV02_I2C_MODE 0

#define ACCEL_CS_BIT BIT2
#define ACCEL_CS_PORT GPIOC

#define ACCEL_CS_INIT() SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK;\
PORTC_PCR2 = PORT_PCR_MUX(1);\
Sbi(GPIOC_PDDR, ACCEL_CS_BIT); 

#define ACCEL_CS_ASSERT() cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_CS_DEASSERT() sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_SPI_INIT() SPI0_Init()
#define ACCEL_Read SPI0_WriteReadByte
#define ACCEL_Write SPI0_WriteReadByte
//-----------------------------------------------------------------------------



Posted by nexp

댓글을 달아 주세요

[FreeScale]/KINETIS2013. 11. 2. 23:00

K20 EVM - Kinetis Cortex-M4 SPI 테스트1

K20 EVM - Kinetis Cortex-M4 SPI 테스트


Cortex-M4 K20 SPI 관련 자료 정리.

SPI클럭은 최대 25로 동작한다.


K20 SPI블록도




K20 SPI 제어 레지스터

MKL25Z 보다 기능이 많아서 레지스터가 많이 복잡해 졌다. 하지만 SPIx_MCR, SPIxCTA 레지스터만 보면 대부분의 기본 기능을 사용할 수 있다. 물론 다양한 설정으로 좀더 복잡한 기능을 구현 가능하다.






11 CLR_TXF

Clear TX FIFO

Flushes the TX FIFO. Writing a 1 to CLR_TXF clears the TX FIFO Counter. The CLR_TXF bit is always

read as zero.

0 Do not clear the TX FIFO counter.

1 Clear the TX FIFO counter.



10 CLR_RXF

Flushes the RX FIFO. Writing a 1 to CLR_RXF clears the RX Counter. The CLR_RXF bit is always read

as zero.

0 Do not clear the RX FIFO counter.

1 Clear the RX FIFO counter.



9-8 SMPL_PT

Sample Point

Controls when the DSPI master samples SIN in Modified Transfer Format. This field is valid only when

CPHA bit in CTARn[CPHA] is 0.

00 0 system clocks between SCK edge and SIN sample

01 1 system clock between SCK edge and SIN sample

10 2 system clocks between SCK edge and SIN sample

11 Reserved



K20 SPI 초기화 함수

void SPI0_Init(void)

{

SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK;      //Turn on clock to D module  

  SIM_SCGC6 |= SIM_SCGC6_SPI0_MASK; 

//_SPI0_IO_INIT();

PORTC_PCR5=PORT_PCR_MUX(2);//PC5,SPI0 SCK

PORTC_PCR6=PORT_PCR_MUX(2);//PC6,SPI0 SOUT

PORTC_PCR7=PORT_PCR_MUX(2);//PC7,SPI0 SIN

//SPI_C1_CPOL_MASK

//SPI_C1_CPHA_MASK

Sbi(SPI0_MCR, SPI_MCR_HALT_MASK|SPI_MCR_MSTR_MASK);

Sbi(SPI0_MCR, SPI_MCR_DCONF(0x0));


Cbi(SPI0_MCR, SPI_MCR_MDIS_MASK);

Sbi(SPI0_MCR, SPI_MCR_CLR_TXF_MASK | SPI_MCR_CLR_RXF_MASK);


SPI0_TCR = SPI_TCR_SPI_TCNT(0x00);  

Cbi(SPI0_CTAR0, SPI_CTAR_DBR_MASK);


 

SPI0_CTAR0 = SPI_CTAR_FMSZ(7); //8bit

SPI0_SetSpeed(SPI_SPEED_4MHZ);

//SPI Mode

//Sbi(SPI0_CTAR0, SPI_CTAR_CPHA_MASK);

//Sbi(SPI0_CTAR0, SPI_CTAR_CPOL_MASK);

    //SPI0_MCR: HALT=0

Cbi(SPI0_MCR, SPI_MCR_HALT_MASK);

}




SPIxCTA 레지스터






17-16 PBR

Baud Rate Prescaler

Selects the prescaler value for the baud rate. This field is used only in Master mode. The baud rate is the

frequency of the SCK. The system clock is divided by the prescaler value before the baud rate selection

takes place. See the BR field description for details on how to compute the baud rate.

00 Baud Rate Prescaler value is 2.

01 Baud Rate Prescaler value is 3.

10 Baud Rate Prescaler value is 5.

11 Baud Rate Prescaler value is 7.


3-0 BR

Baud Rate Scaler

Selects the scaler value for the baud rate. This field is used only in Master mode. The prescaled system

clock is divided by the Baud Rate Scaler to generate the frequency of the SCK. The baud rate is

computed according to the following equation:

SCK baud rate = (fSYS/PBR) x [(1+DBR)/BR]



K20 SPI 송수신 함수

unsigned char SPI0_WriteReadByte(unsigned char Data)

{

//SPTEF - 1 이면 데이터 전송

    unsigned char temp; 


while (!(SPI0_SR & SPI_SR_TFFF_MASK)) ;  

//Write char to SPI     

SPI0_PUSHR = Data;


    

//SPRF - 1 이면 데이터 수신

//while (!(SPI0_SR & SPI_SR_RXCTR_MASK)) ;  

    while (!(SPI0_SR & SPI_SR_RFDF_MASK)) ;  

    

    temp = SPI0_POPR;

    SPI0_SR = SPI_SR_TFFF_MASK | (SPI0_SR&SPI_SR_RFDF_MASK);

return temp;    

}



K20 SPI SPIxTCR 레지스터

좀 특이한 사항으로 하드웨어적으로 TCR레지스터가 있어 전송 회수를 알 수 있고 이를 이용해서 버퍼 관리가 편리해 진다. 이부분은 좀더 들여다 볼 필요가 있는것 같다.







K20 SPI모드 설정













Posted by nexp

댓글을 달아 주세요

[FreeScale]/KINETIS2013. 11. 2. 22:30

K20 EVM - Kinetis Cortex-M4 K20 UART 테스트

K20 EVM - Kinetis Cortex-M4 K20  UART 테스트


K20의 UART는 일반 UART 3채널로 구성되어 있다.


PTA1 -> UART0_RX

PTA2 -> UART0_TX


PTB16 ->UART0_RX

PTB17 ->UART0_TX


PTD6 -> UART0_RX

PTD7 -> UART0_TX



PTC3 ->UART1_RX

PTC4 ->UART1_TX


PTD2 ->UART2_RX

PTD3 ->UART2_TX


UART clocking

UART0 and UART1 modules operate from the core/system clock, which provides higher

performance level for these modules. All other UART modules operate from the bus

clock.






K20 UART 초기화 함수

// Serial Prot0 Utility Fuction Routine

void U0_Init(unsigned char baud)

{

//UART포트 설정

// Enable the UART_RXD function on PTA1 

PORTA_PCR1 = PORT_PCR_MUX(0x2);


// Enable the UART_TXD function on PTA2 

PORTA_PCR2 = PORT_PCR_MUX(0x2);


//UART0 클럭 Enable 

SIM_SCGC4 |= SIM_SCGC4_UART0_MASK;

    //UART disable

    UART_C2_REG(UART0_BASE_PTR) &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK );


    //Configure the UART for 8-bit mode, no parity(디폴트 값 사용)

    UART_C1_REG(UART0_BASE_PTR) = 0;

    

    

    U0_SetBaud(baud);


 

    //Enable UART

UART_C2_REG(UART0_BASE_PTR) |= (UART_C2_TE_MASK | UART_C2_RE_MASK );

}





UARTx_S1(UART Status Register 1)





DRE

Transmit Data Register Empty Flag

TDRE will set when the number of datawords in the transmit buffer (D and C3[T8])is equal to or less than

the number indicated by TWFIFO[TXWATER]. A character that is in the process of being transmitted is

not included in the count. To clear TDRE, read S1 when TDRE is set and then write to the UART data

register (D). For more efficient interrupt servicing, all data except the final value to be written to the buffer

must be written to D/C3[T8]. Then S1 can be read before writing the final data value, resulting in the

clearing of the TRDE flag. This is more efficient because the TDRE reasserts until the watermark has

been exceeded. So, attempting to clear the TDRE with every write will be ineffective until sufficient data

has been written.

0 The amount of data in the transmit buffer is greater than the value indicated by TWFIFO[TXWATER].

1 The amount of data in the transmit buffer is less than or equal to the value indicated by

TWFIFO[TXWATER] at some point in time since the flag has been cleared.



5

RDRF

Receive Data Register Full Flag

RDRF is set when the number of datawords in the receive buffer is equal to or more than the number

indicated by RWFIFO[RXWATER]. A dataword that is in the process of being received is not included in

the count. RDRF is prevented from setting while S2[LBKDE] is set. Additionally, when S2[LBKDE] is set,

the received datawords are stored in the receive buffer but over-write each other. To clear RDRF, read S1

when RDRF is set and then read D. For more efficient interrupt and DMA operation, read all data except

the final value from the buffer, using D/C3[T8]/ED. Then read S1 and the final data value, resulting in the

clearing of the RDRF flag. Even if RDRF is set, data will continue to be received until an overrun condition

occurs.

0 The number of datawords in the receive buffer is less than the number indicated by RXWATER.

1 The number of datawords in the receive buffer is equal to or greater



K20 UART 송수신 함수

unsigned char U0_GetByte(void)

{

//데이터가 수신되면

while (!(UART_S1_REG(UART0_BASE_PTR) & UART_S1_RDRF_MASK));


//데이터 읽어옴

return UART_D_REG(UART0_BASE_PTR);

}



void U0_PutByte(unsigned char Data)

{

//송신 FIFO가 비어지면

while(!(UART_S1_REG(UART0_BASE_PTR) & UART_S1_TDRE_MASK));


//데이터 전송

UART_D_REG(UART0_BASE_PTR) = Data;

}





Posted by nexp

댓글을 달아 주세요

[FreeScale]/KINETIS2013. 11. 2. 20:00

FRDM-KL25Z 를 이용한 Kinetis 디버거(SWD JTAG) 제작하기

FRDM-KL25Z 를 이용한 Kinetis 디버거(SWD JTAG) 제작하기



FRDM-KL25Z는 만원대의 저렴한 Kenetis 개발도구 임에도 불구하고 SWD JTAG 디버거를 내장하고 있다.

개발보드 내의 KL25Z를 디비깅 할수 도 있고 다른 보드의 Kinetis (Cortex-M0, Cortex-M4 등)를 디버깅 할 수도 있다.


다만 JTAG를 외부로 사용하기 위해 하드웨어적으로 처리를 좀 해 주어야 한다.

물론 간단히 작업 가능하다.







JTAG 내부 외부 설정 점퍼 작업



Posted by nexp

댓글을 달아 주세요

[FreeScale]/KINETIS2013. 11. 2. 18:30

FreeScale Cortex-M4 Kinetis K20 EVM 보드제작

FreeScale Cortex-M4 Kinetis K20 EVM 보드제작




소매가 기준 3000원대 저렴한 Cortex-M4 가 눈에 띄어 보드 제작해 보았다.

저렴하며 소형이며 성능또한 나쁘지 않아 SM-Type EVM 형태로 제작 해서 기존 확장 테스트 보드에서 호환할 수 있도록 했다.



K20은 128K Flash, 16K Ram, 50Mhz로 동작하는 저렴한 Cortex-M4 코어이다. 물론 속도는 느리지만 저렴함을 강점으로 내새우고 있다. M4코어 이므로 FPU를 지원한다. 그리고 16bit ADC, 12bit DAC를 내장하고 있어 아날로그 파트도 강점이다.

엘레파츠에서 소량 구매시 3천원대에 구매할 수 있다.





K20 EVM 보드는 기존 여러 확장 보드에 연결하여 테스트 가능하다. 

MP3 확장 테스트 보드



TFT-LCD 확장 테스트 보드



LCD 및 FND VR 등을 테스트 할 수 있는 STM32-SM EXP 확장 보드



Ethernet 테스트 할 수 있는 [NET_EV SM EVM] 확장 테스트 보드





[K20 EVM] 회로도 핀맵

기존 SM-Type EVM 형태로 핀맵 호환 되도록 제작해서 여러 확장 보드에 사용할수 있도록 했다.










Posted by nexp

댓글을 달아 주세요