[Microchip]/PIC16F2012. 6. 9. 01:31

[PIC16F73] SPI 테스트

[PIC16F73] SPI 테스트

 

- FOSC/4 (or TCY)
- FOSC/16 (or 4 • TCY)
- FOSC/64 (or 16 • TCY)
- (Timer2 output)/2 data rate of 5 Mbps(at FOSC = 20 MHz).

 

 

PIC16F723 SPI 블록도

 

 

 

 

 

 

PIC16F723 SPI 레지스터

 

 

 

 

 

PIC16F723 SPI초기화 함수

void SPI0_Init(void)
{
 //RC3 pin => SCK output
 //RC4 pin => SDI input
 //RC5 pin => SDO output
 SSPBUF = 0x00;  //SSPBUF Clear
 ADCON1 = 0x06;

 Cbi(TRISC, (BIT3|BIT5));
 Sbi(TRISC, (BIT4));

 SSPSTAT = 0;
 SSPEN = 1;    //spi enable
 SSPM2 = 0;    //master 

 SSPM1 = 0;SSPM0 = 0; // FOSC/4
 
 CKE = 1;        // data transmitted on rising edge
 CKP = 0;        // clock idle state low
}

 

 

PIC16F723 SPI Write Read함수 포팅

unsigned char SPI0_WriteReadByte(unsigned char Data)
{
 SSPBUF = Data;           // write to buffer for TX
 while ( !BF );          // wait until cycle complete
 return ( SSPBUF );      // return with byte read
}

 

Posted by nexp

댓글을 달아 주세요

[DSP]/DSP60002012. 2. 10. 23:30

[TMS320C6720] SPI 테스트 - 3축 가속도 센서 CCS 를 이용한 그래프표시 하기

[TMS320C6720] SPI 테스트 - 3축 가속도 센서 CCS 를 이용한 그래프표시 하기

TMS320C6720에는 UART는 없지만 SPI포트가 2채널 있다.
테스트 결과 최대 클럭 스피드는 50Mhz(100Mhz//(1+1))까지 출력은 가능하다. FIFO가 없긴하지만, 클럭 설정도 유연하게 설정가능한것 같고...DMA도 지원한다니 SPI인터페이스에 좋을것 같다.



TMS320C6720SPI 관련 블록도





TMS320C672x SPI 주요 레지스터

SPIFMTx 레지스터
17 :  POLARITY
16 : PHASE
15-8 : PRESCALE[7:0]
  BR = SYSCLK2/(PRESCALEx + 1)

SPIDATx : 송신 버퍼

SPIBUF : 수신 버퍼


TMS320C6720 SPI Read/Write함수
SPI1BUF레지스터의 RXEMPTY(BIT31) 가 1이되면 수신이 완료된 것을 나타내고 데이터를 가져오면 된다.
unsigned char SPI1_WriteReadByte(unsigned char Data)

 _SPI1DATA0 = Data;

 while(_SPI1BUF & BIT31);

 return (_SPI1BUF & 0xFF);
}



TMS320C6720 SPI테스트 예제 소스코드
#include "system.h"
#include "myAccel.h"

void main()
{
 unsigned int idx = 0;
 short data = 0;
 short buf[128];

 SystemInit();

 //Led Init..
 Led1Init();
 Led2Init();

 Led1Off();
 Led2Off();

 DebugPrint("[TMS320C6720 EVM] Test Program - SPI Accel Test.\n");

myAccel3lvInit();
   //1000.0111 Power on, enable all axis, self test off
 myAccel3lvWrite(CTRL_REG1, 0xC7);  
    DebugPrint("Accel Init\r\n");   
   
 data = myAccel3lvRead(WHO_AM_I);
 DebugPrint("Who am I? 0x%02X\r\n", data);     

 while(1)
 {
  if(idx > 128)
  {
   for(idx=0;idx<128;idx++)buf[idx]=0;
   idx = 0;
  }

  GetAccelValue(AXIS_X, &data);
  buf[idx++] = data;

  Led1Toggle();
  DebugPrint("%d\r\n", data);
 }
}




[LCD_EXP_EVM] 보드 의 SPI커넥터



CCS3.3을 이용하면 데이터를 그래프로 볼 수 있어 편리한데, 3축 가속도 센서의 데이터값을 그래프로 보기 위해 적당한 값으로 버퍼 잡고 (short buf[128]), 브레이크 포인트 걸어서 실시간으로 센서 데이터값을 그래프로 확인 가능하다.




디버깅 툴이 그리 빠르지 않은넘이라... 실시간이라기는 좀 그렇지만 전체적인 센서의 추위는 확인 할 수 있다.




TMS320C 6720 SPI 가속도센서 테스트 동영상

Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42011. 12. 6. 23:30

[STM32F4] W5100/W5200 TPC/IP Loopback 전송 속도 테스트

[STM32F4] W5100/W5200 TPC/IP Loopback 전송 속도 테스트



SPI 최대 클럭 21Mhz에서 3.5Mbps 정도 나온다.
빠르긴 한데.. 아쉬운 점은 168Mhz MCU인데 속도가 기대한 만큼은 나오지 않는것 같다.
(PIC32 CP/IP 전송 속도 테스트 결과 와 비교하면 80Mhz PIC32가 더 빠르게 나온다)

SPI클럭 설정을 좀더 자유롭게 할 수 있으면 좋을것 같은데....
SPI FIFO가 없어 그런것 같은데... DMA를 이용하면 좀더 빨라지지 않을까?

------------------------------------------------------------
[7] iInChip Send: 3.5567 Mbps(5278574 bytes, 11.3230 sec)
iInChip Recv: 3.5074 Mbps(5278574 bytes, 11.4822 sec)
------------------------------------------------------------
[8] iInChip Send: 3.5647 Mbps(5278574 bytes, 11.2975 sec)
iInChip Recv: 3.3565 Mbps(5278574 bytes, 11.9982 sec)
--------------------------------------------------------






Cortex-M4 STM32F405 의 W5200 HAL Driver 코드
//-----------------------------------------------------------------------------
// W5100 HAL
#define _SPI1_ENABLE     1

#define W5100_CS_PORT     GPIOB
#define W5100_CS_BIT     BIT12

#define W5100_RST_PORT     GPIOA
#define W5100_RST_BIT     BIT0

#define IINCHIP_RSToff()    cbi(W5100_RST_PORT, W5100_RST_BIT) 
#define IINCHIP_RSTon()     sbi(W5100_RST_PORT, W5100_RST_BIT)

#define W5100_IO_INIT()     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);\
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;\
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\
          GPIO_InitStructure.GPIO_Pin=W5100_CS_BIT;\
          GPIO_Init(GPIOB, &GPIO_InitStructure);\
          GPIO_InitStructure.GPIO_Pin=W5100_RST_BIT;\
          GPIO_Init(GPIOA, &GPIO_InitStructure);


#define IINCHIP_CSoff()     cbi(W5100_CS_PORT, W5100_CS_BIT) 
#define IINCHIP_CSon()     sbi(W5100_CS_PORT, W5100_CS_BIT)

#define IINCHIP_SPI_INIT()    SPI1_Init();IINCHIP_SpiSpeed()
#define IINCHIP_SpiSendData    SPI1_WriteReadByte
#define IINCHIP_SpiRecvData    SPI1_WriteReadByte
#define IINCHIP_SpiSpeed()              SPI1_SetSpeed(SPI_SPEED_MAX)
//-----------------------------------------------------------------------------
Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM32F42011. 12. 6. 21:00

[STM32F4] SPI 테스트

[STM32F4] SPI 테스트
STM32F4  의 SPI는 3채널이 있고 37.5Mbits/s 로 고속 전송이 가능해 졌다고 한다.


STM32F4 SPI 블록도




STM32F4 소프트웨어는 STM32F103과 거의 호환 가능하다. 초기화 부분에 GPIO설정 부분만 수정하면 문제 없이 동작한다.
SPI클럭을 최대로 설정하니 42Mhz 정도 나온다.


STM32F4 SPI 초기화 함수
void SPI0_Init(void)
{
 SPI_InitTypeDef   SPI_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
   
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

 // Set SPI interface
 SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
 SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
 SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
 SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
 SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
 SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
 SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;
 SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial=7;

 SPI_Init(SPI1,&SPI_InitStructure);
 SPI_Cmd(SPI1,ENABLE);     //Enable  SPI1
}



STM32F4 SPI Wrire 함수
unsigned char SPI0_WriteReadByte(unsigned char Data)
{
    while((SPI1->SR & SPI_I2S_FLAG_TXE) == RESET);
   
    SPI1->DR =  Data;
    while((SPI1->SR & SPI_I2S_FLAG_RXNE) == RESET);
   
    return (SPI1->DR);
}



Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430F5x2011. 11. 26. 17:30

[MSP430F5529 EVM] SPI테스트 - 3축 가속도 센서 출력

[MSP430F5529 EVM] SPI테스트 - 3축 가속도 센서 출력

[MSP430F5510 EVM] 및 [MSP430F5529 EVM] 의 SPI는 PORT4의 USB1에 할당 되어 있다.
핀맵을 보면 아래와 같다.

P4.3/PM_UCB1CLK/PM_UCA1STE
P4.2/PM_UCB1SOMI/PM_UCB1SCL
P4.1/PM_UCB1SIMO/PM_UCB1SDA
P4.0/PM_UCB1STE/PM_UCA1CLK




MSP430F5x의 SPI특징
SPI mode features include:
• 7-bit or 8-bit data length
• LSB-first or MSB-first data transmit and receive
• 3-pin and 4-pin SPI operation
• Master or slave modes
• Independent transmit and receive shift registers
• Separate transmit and receive buffer registers
• Continuous transmit and receive operation
• Selectable clock polarity and phase control
• Programmable clock frequency in master mode
• Independent interrupt capability for receive and transmit
• Slave operation in LPM4



MSP430F5x SPI블록도





MSP430F5x SPI 통신 초기화 함수
void SPI1_Init(void) // SPI 통신 초기화 함수
{
 // Select SPI functionality on DIO pins for MOSI, MISO, & CLK.
 P4SEL |= (BIT1|BIT2|BIT3);  
   
  UCB1CTL1 |= UCSWRST;                      // **Put state machine in reset**
  UCB1CTL0 |= UCMST+UCSYNC+UCMSB+UCCKPH;    // 3-pin, 8-bit SPI master
  UCB1CTL1 |= UCSSEL_2;                     // SMCLK
  UCB1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
//  UCB1IE |= UCRXIE;     

   SPI1_SetSpeed(SPI_SPEED_1MHZ);
}



MSP430F5x SPI 전송 함수
#define SPI1_WRITE_BYTE(x)                 UCB1TXBUF = (x);
#define SPI1_READ_BYTE()     UCB1RXBUF
#define SPI1_WAIT_FOR_EN()     while (!(UCTXIFG&UCB1IFG));
#define SPI1_WAIT_FOR_SEND()              while (UCB1STAT & UCBUSY);
#define SPI1_WAIT_FOR_RX()     while (!(UCRXIFG&UCB1IFG))


unsigned char SPI1_WriteReadByte(unsigned char Data)
{
 SPI1_WAIT_FOR_EN();
 SPI1_WRITE_BYTE(Data);
 SPI1_WAIT_FOR_SEND();
 return SPI1_READ_BYTE();
}



MSP430F5510 SPI Accel 드라이버 함수
#define _SPI1_ENABLE    1

//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE   1
#define MY_ACCEL3LV02_I2C_MODE   0

//AccelCS A8-P3.7
#define ACCEL_CS_BIT     BIT6
#define ACCEL_CS_PORT     PORT4

#define ACCEL_CS_INIT()     Sbi(P4DIR, 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()    SPI1_Init()
#define ACCEL_Read      SPI1_WriteReadByte
#define ACCEL_Write      SPI1_WriteReadByte
//-----------------------------------------------------------------------------



MSP430F5529 3축 가속도 센서 출력 테스트 예제 소스코드
#include "system.h"
#include "serial.h"
#include "spi.h"
#include "myAccel.h"

void main(void)
{
   short data = 0;
    SystemInit();

    Led1Init();
    Led1On();
   
 DebugInit(BAUD_115200);
 DebugPrint("MSP430F5529 EVM SPI Accel Test\r\n");

 myAccel3lvInit();
    myAccel3lvWrite(CTRL_REG1, 0xC7);  //1000.0111 Power on, enable all axis, self test off
   
    while(1)
    {
        Led1Toggle();
       GetAccelValue(AXIS_X, &data);
       DebugPrint("%d\r\n", data); 
 
        Delay(100);
    }
}


Posted by nexp

댓글을 달아 주세요