[TI]/TM4C2015.02.16 03:38

TM4C123 EVM - W5500 TCP/IP 전송 속도 테스트

TM4C123 EVM - W5500 TCP/IP 전송 속도 테스트



[NET_EV_SM EVM]보드와 W5500 EVM 보드를 이용하여 Ethernet (TCP/IP) 테스트를 진행 했다.

고성능 Cortex-M4 코어의 TM4C123 에서 Ethernet 기능을 추가해 두면 여러 프로젝트에서 유용할 것 같다.

위 사진과 같이 W5500 EVM 보드를 연결하면 Ethernet을 쉽게 테스트 가능하다. 



W5100, W5200, W5500 Ethernet 모듈은 [NET_EV_SM EVM] 보드의 SPI-EXP 모듈을 연결하여 쉽게 테스트 가능하다.


W5500의 CS핀은 P_B15 -> CN18_15pin ->PD6

/RST 핀은 P_A3->CN17_3pin -> PE1

에 연결되어 있다.



TM4C123 코드에서 W5500 Driver Code에서 아래와 같이 핀을 할당 할 수 있다.

//-----------------------------------------------------------------------------

// W5500 HAL


#define W5500_CS_PORT PORTD

#define W5500_CS_BIT BIT6


#define W5500_RST_PORT PORTE

#define W5500_RST_BIT BIT1


#define IINCHIP_RSToff() PE1 = 0

#define IINCHIP_RSTon() PE1 = BIT1


#define IINCHIP_CSoff() PD6 = 0

#define IINCHIP_CSon() PD6 = BIT6


                                        

#define W5500_IO_INIT() ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);\

                                        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, W5500_CS_BIT);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, W5500_RST_BIT);


#define IINCHIP_SPI_INIT() SPI0_Init();IINCHIP_SpiSpeed()

#define IINCHIP_SpiSendData SPI0_WriteReadByte

#define IINCHIP_SpiRecvData SPI0_WriteReadByte

#define IINCHIP_SpiSpeed()              SPI0_SetSpeed(SPI_SPEED_MAX)

//-----------------------------------------------------------------------------




TM4C123의 이더넷 테스트를 위해 TCP/IP 루프백 테스트 코드를 이용하였다. 

int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port)

{

   int32_t ret;

   uint16_t size = 0, sentsize=0;

   switch(getSn_SR(sn))

   {

      case SOCK_ESTABLISHED :

         if(getSn_IR(sn) & Sn_IR_CON)

         {

            setSn_IR(sn,Sn_IR_CON);

         }

         if((size = getSn_RX_RSR(sn)) > 0)

         {

            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;

            ret = recv(sn,buf,size);

            if(ret <= 0) return ret;

            sentsize = 0;

            while(size != sentsize)

            {

               ret = send(sn,buf+sentsize,size-sentsize);

               if(ret < 0)

               {

                  close(sn);

                  return ret;

               }

               sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.

            }

         }

         break;

      case SOCK_CLOSE_WAIT :

         if((ret=disconnect(sn)) != SOCK_OK) return ret;

         break;

      case SOCK_INIT :

         if( (ret = listen(sn)) != SOCK_OK) return ret;

         break;

      case SOCK_CLOSED:

         if((ret=socket(sn,Sn_MR_TCP,port,0x00)) != sn)

            return ret;

         break;

      default:

         break;

   }

   return 1;

}




TM4C123은 기본 드라이버 코드가 ROM에 저장되어 있기 때문에 코드 사이즈를 상당히 줄일 수 있다.

실제 컴파일 해 보면 코드 사이즈가 7kbyte로 상당히 적은것을 확인 할 수 있다.


[1] = D:\WORK\ARM\TM4C\tm4c123_evm\ex10_w5500\ewarm66\Debug\Obj

[2] = command line

[3] = dl7M_tln.a

[4] = driverlib.a

[5] = m7M_tlv.a

[6] = rt7M_tl.a

[7] = shb_l.a


  7 072 bytes of readonly  code memory

    720 bytes of readonly  data memory

  2 645 bytes of readwrite data memory




Wiznet사의 AX1프로그램을 이용하여 W5500의 TCP/IP 루프백 전송 속도 테스트를 해 보면 TM4C123 의 SPI 최대 속도는 12Mhz에서 2Mbps 정도로 측정된다. 

TCP/IP 전송 속도 테스트 결과 참고 에서와 같이 TCP/IP 전송 속도를 비교해 보면 SPI속도가 느려서 그런지 약간의 한계가 있어 페리 기능이 좀 아쉽다.


[1] iInChip Send: 2.1093 Mbps(348160 bytes, 1.2593 sec)

iInChip Recv: 1.9174 Mbps(348160 bytes, 1.3853 sec)

------------------------------------------------------------

[2] iInChip Send: 2.0543 Mbps(348160 bytes, 1.2930 sec)

iInChip Recv: 1.7646 Mbps(348160 bytes, 1.5053 sec)

------------------------------------------------------------

[3] iInChip Send: 2.1132 Mbps(348160 bytes, 1.2570 sec)

iInChip Recv: 1.8640 Mbps(348160 bytes, 1.4250 sec)

------------------------------------------------------------

[4] iInChip Send: 2.1347 Mbps(348160 bytes, 1.2443 sec)

iInChip Recv: 1.9225 Mbps(348160 bytes, 1.3817 sec)

------------------------------------------------------




TM4C123 EVM 과 W5500을 이용하여 TCP/IP 테스트 코드

#include "system.h"

#include "serial.h"

#include "wiznet.h"


#define SOCK_TCPS0       0

#define DATA_BUF_SIZE   2048

uint8_t gDATABUF[DATA_BUF_SIZE];


void ProcessTCPS(void)

{

    loopback_tcps(SOCK_TCPS0, gDATABUF, 3000);

}


int main(void)

{

    short data;

    

    SystemInit();

    Led1Init();

    Led1On();

    

    Led2Init();

    Led2On();

    

    DebugInit(BAUD_115200);

    DebugPrint("TM4C Uart Test\r\n");


    //W5500 초기화 함수

    W5500_Init();

    

    while(1)

    {

        ProcessTCPS();      

    }

}


Posted by nexp

댓글을 달아 주세요

[TI]/TM4C2014.08.17 22:30

TM4C123 USB 테스트 - CAN2USB 테스트

TM4C123 USB 테스트 - CAN2USB 테스트



TM4C123은 기존 Crtex-M3 코어 시리즈인 LM3S5732 와 같이 USB Device, HOST를 지원하고 CAN통신이 가능하다.

USB를 지원하면서 CAN이 가능한 MCU중에서 저렴하고 사용하기 편리하기 때문에 USB2CAN 보드 제작하기에 좋을것 같다.



TM4C123 USB 관련 핀맵




TM4C123 USB 초기화 코드

void InitializeUsb(void)

{

    // Enable the GPIO peripheral used for USB, and configure the USB pins

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);    

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);

ROM_GPIOPinTypeUSBAnalog(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5);

    

    // Initialize the transmit and receive buffers.

    USBBufferInit((tUSBBuffer *)&g_sTxBuffer);

    USBBufferInit((tUSBBuffer *)&g_sRxBuffer);



    // Pass our device information to the USB library and place the device

    // on the bus.

    USBDBulkInit(0, (tUSBDBulkDevice *)&g_sBulkDevice);    

}



TM4C123 USB 데이터 수신 처리 함수

//---------------------------------------------------------

//수신 데이터 처리 

//pvMsgData 는 수신된 데이터의 포인터

data = (unsigned char*)(pvMsgData);

for(i=0;i<ui32MsgValue;i++)

{

DebugPrint("%02X ", *(data+i));

}

DebugPrint("\r\n");


switch(*data)

{

case CMD_SET_LED:

Led1On();

break;

case CMD_RESET_LED:

Led1Off();

break;

case CMD_SET_LED2:

Led2On();

break;

case CMD_RESET_LED2:

Led2Off();

break;                

case CMD_READ_CAN_DATA:

USBBufferInit((tUSBBuffer *)&g_sTxBuffer);

    //CAN통신 데이터 처리

CANProcess(g_sTxBuffer);


    //USB 데이터 전송

USBBufferDataWritten(&g_sTxBuffer, 2);                

break;

}

//---------------------------------------------------------




USB2CAN 테스트 PC 프로그램
LM3S5732에서 작성 했던 프로그램을 동일하게 테스트 가능하다



TM4C123 USB2CAN 테스트 동영상


Posted by nexp

댓글을 달아 주세요

[TI]/TM4C2014.08.17 19:00

TM4C123 - CAN 통신 테스트

TM4C123 - CAN 통신 테스트




TM4C123 은 2채널의 CAN 듈이 있다. 기존  Stellaris 시리즈와 거의 유사하게 되어 있어 기존 코드 수정없이 사용가능하다.

■ CAN protocol version 2.0 part A/B
■ Bit rates up to 1 Mbps
■ 32 message objects with individual identifier masks
■ Maskable interrupt
■ Disable Automatic Retransmission mode for Time-Triggered CAN (TTCAN) applications
■ Programmable Loopback mode for self-test operation
■ Programmable FIFO mode enables storage of multiple message objects
■ Gluelessly attaches to an external CAN interface through the CANnTX and CANnRX signals



TM4C123 의 CAN통신 핀맵



기존과 조금 다른 점으로 CAN 핀맵을 리맵 할 수 있다는 것인데.. 테스트를 위해 PB4, PB5에 할당해서 테스트 하기로 했다.

CAN0RX -> PB4

CAN0TX -> PB5



EVB_DSP 보드에서 







EXP_SM EVM 보드에서






코드는 기본적으로 LM3S 시리즈의 CAN통신 예제와 동일하다. 


TM4C123 CAN 초기화 함수

기존과 조금 달라진 점은 CAN 통신 속도 설정하는 부분이 좀더 간단히 처리할 수 있도록 되어 있다.

    //포트클럭 설정

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);


    //CAN 포트 설정

    GPIOPinConfigure(GPIO_PB4_CAN0RX);

    GPIOPinConfigure(GPIO_PB5_CAN0TX);

    GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5);


    // CAN클럭 초기화

    SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);


    // Initialize the CAN controller

    CANInit(CAN0_BASE);


    // CAN통신 속도 설정

    CANBitRateSet(CAN0_BASE, SysCtlClockGet(), 500000);



    // CAN interrupts 설정

    CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);

    IntEnable(INT_CAN0);


    // Enable the CAN for operation.

    CANEnable(CAN0_BASE);



CAN 메세지 전송하기
CAN데이터를 전송하려면 먼저 CAN Message Object를 초기화하고 전송해야 한다.

tCANMsgObject g_MsgObjectRx;

//메세지 오브젝트 초기화
void CANConfigureNetwork(void)
{
    //TX용 CAN 메시제 오프젝트 초기화
    g_MsgObjectTx.ulMsgID = 0x02;   //CAN ID
    g_MsgObjectTx.ulMsgIDMask = 0;

    //인터럽트 설정
    g_MsgObjectTx.ulFlags = MSG_OBJ_TX_INT_ENABLE;

    //메세지 크기
    g_MsgObjectTx.ulMsgLen = MAX_CAN_MSG_SIZE;
    //메시지 버퍼 설정
    g_MsgObjectTx.pucMsgData = g_CanTxMsgBuffer;
}

//CAN 메세지 전송
void SendCanMsg(unsigned char MsgId, unsigned char ucEvent, unsigned char Data)
{
    //MsgId : Message Object의 번호(수신측에서는 의미없는 값이다.)
 
    g_MsgObjectTx.pucMsgData[0] = ucEvent;
    g_MsgObjectTx.pucMsgData[1] = Data;

 /*
    //필요에 따라서 설정
    g_MsgObjectTx.pucMsgData[2] = 0;
    g_MsgObjectTx.pucMsgData[3] = 0;
 
    g_MsgObjectTx.pucMsgData[4] = 0;
    g_MsgObjectTx.pucMsgData[5] = 0;
    g_MsgObjectTx.pucMsgData[6] = 0;
    g_MsgObjectTx.pucMsgData[7] = 0;
 */ 
 
    CANMessageSet(CAN0_BASE, MsgId, &g_MsgObjectTx, MSG_OBJ_TYPE_TX);
}




CAN메세지 수신하기
CAN데이터를 전송하려면 먼저 CAN Message Object를 초기화 해야 수신할 수 있다. 수신하고 싶은 ID를 msg.ulMsgID 에 정의 하고 CANMessageSet()함수로 설정 할 수 있다. 물론 message object개수(1~32)만큼 설정 가능하다.

//메세지 오브젝트 초기화
void CANConfigureNetwork(void)
{
 tCANMsgObject msg;

    //수신할 CAN ID
    msg.ulMsgID = 0x02;
    msg.ulMsgIDMask = 0;//0xFF;

    //인터럽트 사용
    msg.ulFlags = MSG_OBJ_RX_INT_ENABLE;

    //수신할 버퍼와 크기
    msg.ulMsgLen = MAX_CAN_MSG_SIZE;
    msg.pucMsgData = g_CanTxMsgBuffer;

    //수신할 message object 초기화 (message object : 1~32)
    CANMessageSet(CAN0_BASE, 1, &msg, MSG_OBJ_TYPE_RX);
}



CAN 인터럽트 핸들러

void CANHandler(void)
{
    unsigned long rx_id_status;

    //CAN 인터럽트의 상태값을 읽어온다
    rx_id_status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);
    
     //읽은후 지운다
    CANIntClear(CAN0_BASE, rx_id_status); 
      
 //CAN 인터럽트 처리
 if(rx_id_status)
 {
  //message object 깂을 읽어온다 - 읽어오면 지워진다
  CANMessageGet(CAN0_BASE, rx_id_status, &g_MsgObjectRx, 1);
  
  DebugPrint("[ID%02X %02X:%02x:%02x] : ", 
        rx_id_status,    //message object 번호
     g_MsgObjectRx.ulMsgID,  //수신한 CAN ID
     g_MsgObjectRx.ulMsgIDMask,
     g_MsgObjectRx.ulMsgLen 
     );

  //수신한 데이터 출력
  DebugPrint("%02x %02x %02x %02x | %02x %02x %02x %02x\r\n", 
    g_MsgObjectRx.pucMsgData[0],
    g_MsgObjectRx.pucMsgData[1],
    g_MsgObjectRx.pucMsgData[2],
    g_MsgObjectRx.pucMsgData[3],
    g_MsgObjectRx.pucMsgData[4],
    g_MsgObjectRx.pucMsgData[5],
    g_MsgObjectRx.pucMsgData[6],
    g_MsgObjectRx.pucMsgData[7]    
    ); 
 }
}




Posted by nexp

댓글을 달아 주세요

[TI]/TM4C2014.08.10 14:10

TM4C123 - ADC 테스트

TM4C123 - ADC 테스트




TM4C123에는 독릭적으로 동작하는 2개의 12비트 ADC가 있고 16채널 입력이 가능하다.

아래 그림과 같이 각각 인터럽트 처리 가능하고 트리거 입력 받을수 있다.



요즘 MCU들은 대부분 하드웨어 필터를 내장하고 있는데...  TM4C123은 하드웨어 평균필터 (Hardware averaging of up to 64 samples) 가 있다. 성능은 좀더 들여야 봐야 하겠지만 약간은 아쉬운 부분이 아날로그 파트인것 같다.





TM4C123 ADC 블록도

4개의 FIFO와 Sample Sequencer이 있다.

[TM4C123 EVM] 보드에서 ADC0는 PE3 에 연결되어 있고 원하는 ADC 채널 및 Sequencer에서 AD결과값을 읽어올 수 있다.



TM4C123에는 4개의 Sample Sequencer이 있고 아래과 같이 1~8 스텝을 설정 할 수가 있다.





TM4C123 ADC 테스트 예제

 4개의 Sample Sequencer가 있기 때문에 다채널 ADC입력 받을경우 상당히 편리하게 처리할 수 있다.


//sample sequence 1 에 steps 0, 1 , 2를 설정

ADCSequenceStepConfigure(ADC_BASE, 1, 0, ADC_CTL_CH0);

ADCSequenceStepConfigure(ADC_BASE, 1, 1, ADC_CTL_CH1);

ADCSequenceStepConfigure(ADC_BASE, 1, 2, ADC_CTL_CH2 | ADC_CTL_IE | ADC_CTL_END)


//sample sequence 3에  step 0를 설정

ADCSequenceStepConfigure(ADC_BASE, 3, 0, ADC_CTL_TS | ADC_CTL_END);




TM4C123 ADC 핀맵

12개의 ADC입력 채널이 아래와 같이 할당되어 있다.




TM4C123 ADC 초기화 함수

// Function Routine

//ADC Initialize

void AdcInit(void)

{

    //ADC enable 

    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);


    //ADCProcessorTrigger()에서 ADC 시작. 프로세서 트리거가 일어날때 작동한다.   

    ADCSequenceConfigure(ADC0_BASE, SEQUENCE_NUM, ADC_TRIGGER_PROCESSOR, 0);

    

    //ADC0의 sequence를 구성한다.sequence number 0인 ADC를 single ended mode로 setting   

    ADCSequenceStepConfigure(ADC0_BASE, SEQUENCE_NUM, 0, ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH0);       


    //ADC를 사용 가능하게 해준다.   

   ADCSequenceEnable(ADC0_BASE, SEQUENCE_NUM);  

   ADCIntClear(ADC0_BASE, SEQUENCE_NUM);

}



TM4C123 ADC 데이터 읽기

//Read ADC Value

unsigned long AdcRead(unsigned char port)

{

unsigned long adc_result[NUM_OF_ADC];

ADCProcessorTrigger(ADC0_BASE, SEQUENCE_NUM);   


//sample sequence 가 완료될때 까지 대기한다.   

while(!ADCIntStatus(ADC0_BASE, SEQUENCE_NUM, false)){}  

    ADCIntClear(ADC0_BASE, SEQUENCE_NUM);


//ADC  Data Read

    ADCSequenceDataGet(ADC0_BASE, SEQUENCE_NUM, &adc_result);

return adc_result[port];

}




TM4C123 ADC 하드웨어 필터 설정


// Enable 8x hardware averaging

ADCHardwareOversampleConfigure(ADC_BASE, 8);





TM4C123 ADC - 온도 센서

TM4C123 칩내부에 온도 센서가 내장되어 있고 이를 이용하여 온도 측정을 할수 있다. 

온도 센서에서 온도 값을 구하는 식은 아래와 







        ADCIntClear(ADC0_BASE, 1);

        ADCProcessorTrigger(ADC0_BASE, 1);

        while(!ADCIntStatus(ADC0_BASE, 1, false))

        {

        }

        ADCSequenceDataGet(ADC0_BASE, 1, ui32ADC0Value);

        ui32TempAvg = (ui32ADC0Value[0] + ui32ADC0Value[1] + ui32ADC0Value[2] + ui32ADC0Value[3] + 2)/4;

        ui32TempValueC = (1475 - ((2475 * ui32TempAvg)) / 4096)/10;

        ui32TempValueF = ((ui32TempValueC * 9) + 160) / 5;

        

        DebugPrint("AIN0 = %d, %d\r", ui32TempAvg, ui32TempValueC);

        

        Led1On();

        Delay(300);

        Led1Off();

        Delay(300);   




Posted by nexp

댓글을 달아 주세요

[TI]/TM4C2014.07.27 21:00

TM4C123 EVM - TFT-LCD 테스트

TM4C123 EVM - TFT-LCD 테스트 



TM4C123 보드를 이용하여 TFT-LCD를 적은 핀수로 테스트 할 수 있는 [LCD-CONV] 보드의 TFT-LCD 테스트를 진행 했다. TFT-LCD출력 속도는 18ms로 빠른데 SD Card 읽어들이는 속도가 상대적으로 느려 고속출력은 무리가 있어 보인다.


TI 제공 ROM 함수 사용시

320x240 한프레임 출력 시간이 100ms 정도 출력된다.

상당히 느리다..

#define _LCD_DAT_OUT(Data) ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data>>8);\

                                        LCD_DATA_LATCH();\

                                                                ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data&0xFF)




레지스터 직접 제어시

18ms 로 상당히 빨라졌다.

#define _LCD_DAT_OUT(Data) PORTC = (Data>>8);\

                                              LCD_DATA_LATCH();\

                                                                PORTC = Data




TM4C123 TFT-LCD 테스트 동영상







TM4C123 TFT-LCD 드라이버 코드

//-----------------------------------------------------------------------------

// TFT LCD Driver

#define TFT_DRV_HD66791 0

#define TFT_DRV_COM44 1


                                        

#define LCD_LAT_BIT BIT6

#define LCD_LAT_PORT GPIO2

#define LCD_LAT_ON() PD6 = BIT6;

#define LCD_LAT_OFF() PD6 = 0;

#define LCD_DATA_LATCH() LCD_LAT_ON();LCD_LAT_OFF();


#define LCD_RST_BIT BIT6

#define LCD_RST_PORT GPIOA

#define LCD_RST_ON()

#define LCD_RST_OFF()


#define LCD_WR_BIT BIT0

#define LCD_WR_PORT GPIO2

#define LCD_WR_OFF() (PD0 = 0);

#define LCD_WR_ON() (PD0 = BIT0);


#define LCD_RS_BIT BIT1

#define LCD_RS_PORT GPIO2

#define LCD_RS_OFF() (PD1 = 0);

#define LCD_RS_ON() (PD1 = BIT1);


#define LCD_EN_BIT BIT2

#define LCD_EN_PORT GPIO2

#define LCD_ENABLE() (PD2 = 0);

#define LCD_DISABLE() (PD2 = BIT2);


#define LCD_BL_BIT BIT3

#define LCD_BL_PORT GPIO2

#define LCD_BL_OFF() (PD3 = 0);

#define LCD_BL_ON() (PD3 = BIT3);


/*                                        

#define _LCD_DAT_OUT(Data) ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data>>8);\

                                        LCD_DATA_LATCH();\

                                        ROM_GPIOPinWrite(GPIO_PORTC_BASE, 0xFF, Data&0xFF)

*/


#define _LCD_DAT_OUT(Data) PORTC = (Data>>8);\

                                        LCD_DATA_LATCH();\

                                        PORTC = Data


#define TFTGpioInit() ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, 0xFF);\

                                        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, 0xFF); 

//-----------------------------------------------------------------------------




TM4C123 SD Card 드라이버 코드

//-----------------------------------------------------------------------------

// SD Card HAL

#define _DEBUG_FAT_FILE                 1


#define MMC_CS_PORT GPIOA

#define MMC_CS_BIT     BIT3


#define MMC_CS_INIT() ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, MMC_CS_BIT);


#define MMC_CS_HIGH() PA3 = BIT3

#define MMC_CS_LOW() PA3 = 0;


#define MMC_SpiInit() SPI0_Init()

#define MMC_SendByte SPI0_WriteReadByte

#define MMC_Send(Data) SPI0_WriteReadByte(Data)

#define MMC_Recv() SPI0_WriteReadByte(0xFF)

#define MMC_SPISpeed SPI0_SetSpeed


#define SPI_Mode3() 


#define FAT_MAX_NUM_FILE          50


#define FCLK_SLOW()                     MMC_SPISpeed(SPI_SPEED_1MHZ)

#define FCLK_FAST()                    MMC_SPISpeed(SPI_SPEED_10MHZ) 

//-----------------------------------------------------------------------------




Posted by nexp

댓글을 달아 주세요