WIZnet Developer Forum

w7500 SPI 통신 질문입니다.

데이터 시트와 loop back & SD 예제를 통해서 SPI를 사용해보려고 하는데

아무리 찾아봐도 MOSI/MISO/SCLK/SSEL 을 설정하는 코드가 없더라구요… .!
SD 예제에서는
#define MMC_SD_SCK_PORT MMC_SD_SPI1_PORT
#define MMC_SD_SCK_PIN GPIO_Pin_1

#define MMC_SD_MISO_PORT MMC_SD_SPI1_PORT
#define MMC_SD_MISO_PIN GPIO_Pin_2

#define MMC_SD_MOSI_PORT MMC_SD_SPI1_PORT
#define MMC_SD_MOSI_PIN GPIO_Pin_3

#define MMC_SD_CS_PORT GPIOB
#define MMC_SD_CS_PIN GPIO_Pin_0

이부분만 mmc_sd.h 에 선언만 되어있고 MMC_SD_CS_PIN만 사용되고 나머지는 아무리 찾아봐도 어디에서 사용되는지 안나오더라구요 !

제 질문의 요점을 정리해드리자면 !

  1. MOSI/MISO/SCLK/SSEL 을 어디서 설정하는지, 그리고 따로 설정을해야한다면 어떻게하는지… ? (참고자료라도 부탁드립니다. datasheet 만 보고서는 무리가 있네요… !)

  2. 추측해보기로 SSP1 , SSP0 는 Master 냐 Slave 냐 에 따라서 자동으로 MOSI/MISO/SCLK/SSEL 이게 설정되는지 궁금합니다.

  3. SSP1 과 SSP0 는 포트가 따로 설정되어있던데 PB 0~3 , PA 5~8 로, 이 포트를 통해서 IC칩에 연결하여 데이터를 송신하고 싶은데,
    MOSI/MISO/SCLK/SSEL 설정하고 연결만 하면 되는건가요 ?

안녕하세요 :slight_smile:

  1. SD 예제의 경우에는 uint8_t SD_Init(void)이라는 함수안에서 SSP 설정을 해주게 됩니다. W7500 드라이버에서는 SSP0 혹은 SSP1을 enable 시키는 방법으로 SSP 즉 SPI를 사용하게 됩니다. 그리고 PAD_AFConfig 함수로 Function을 정해주게 됩니다.

SSP1을 사용하고자 하시면 처음 셋팅을 하셔야하는 것이
아래와 같이 StructInit을 해주시고
SSP_StructInit(&SSP1_InitStructure);
SSP1_InitStructure.SSP_SerialClockRate = 0x00;
SSP1_InitStructure.SSP_FrameFormat = SSP_FrameFormat_MO;
SSP1_InitStructure.SSP_CPHA = SSP_CPHA_1Edge;
SSP1_InitStructure.SSP_CPOL = SSP_CPOL_Low;
SSP1_InitStructure.SSP_DataSize = SSP_DataSize_8b;
SSP1_InitStructure.SSP_SOD = SSP_SOD_RESET;
SSP1_InitStructure.SSP_Mode = SSP_Mode_Master;
SSP1_InitStructure.SSP_NSS = SSP_NSS_Hard;
SSP1_InitStructure.SSP_LBM = SSP_LBM_RESET;
SSP1_InitStructure.SSP_SSE = SSP_SSE_SET;
SSP1_InitStructure.SSP_BaudRatePrescaler = SSP_BaudRatePrescaler_2;
아래와 같이 Struct를 이용해 SSP를 Init해주시면 됩니다.
SSP_Init(SSP1,&SSP1_InitStructure);
default pin을 사용 할 시에는 위의 작업만 해주시면 사용이 가능하구요

2nd function이나 3rd Function의 SSP를 사용하고자 하시면 추가적으로 PAD_AFConfig함수를 이용해 해당 pin의 Function을 변경해주시면 됩니다.
ex) PAD_AFConfig(PAD_PA,GPIO_Pin_14 , PAD_AF2); // PA_14핀을 MOSI1(3rd function)으로 PAD_AFConfig

  1. MOSI/MISO/SCLK/SSEL pin은 Master나 Slave 관계없이 사용하시면됩니다.

  2. 해당 핀을 연결하시고 SSP_SendData 함수를 이용해 Data를 보낼 수 있고 SSP_ReceiveData함수를 이용해 Data를 받을 수 있습니다.

자세한 정보는 wizwiki.net을 참조해주시기 바랍니다.

추가 질문 있으면 질문 해주시구요 ^^

감사합니다.

빠른답변 너무 감사드립니다 :slight_smile:

그렇다면 W7500 에서는 SPI를 사용하는 개념이, SSP0/SSP1 을 enable 시키는 방법으로 사용하는 거라고 말씀하셨는데

enable 시키고 (SD예제에서) SD_Init 처럼
SSP_StructInit(&SSP1_InitStructure);
SSP1_InitStructure.SSP_SerialClockRate = 0x00;
SSP1_InitStructure.SSP_FrameFormat = SSP_FrameFormat_MO;
SSP1_InitStructure.SSP_CPHA = SSP_CPHA_2Edge;//SSP_CPHA_1Edge;
SSP1_InitStructure.SSP_CPOL = SSP_CPOL_High;//SSP_CPOL_Low;
SSP1_InitStructure.SSP_DataSize = SSP_DataSize_8b;
SSP1_InitStructure.SSP_SOD = SSP_SOD_RESET;
SSP1_InitStructure.SSP_Mode = SSP_Mode_Master;
SSP1_InitStructure.SSP_NSS = SSP_NSS_Hard;
SSP1_InitStructure.SSP_LBM = SSP_LBM_RESET;
SSP1_InitStructure.SSP_SSE = SSP_SSE_SET;
SSP1_InitStructure.SSP_BaudRatePrescaler = SSP_BaudRatePrescaler_254;
SSP_Init(SSP1,&SSP1_InitStructure);

이렇게 setting 하고 enable 시키면 통신을 위한 준비는 끝이난건가요 ?

그리고 이 설정만으로 MOSI/MISO/SCLK/SSEL 이게 설정이 된건가요 ? (default pin을 사용해도 무관하기에 PAD_AFConfig는 안해도 될것같습니다.)

그리고 제가 하고자 하는게 MBI5025 라는 IC에 16bit data를 보내고 싶은데,

W7500을 SSP0(임의 설정)로 master 로 설정하고 data를 보내기만 하면 되나요 ?

I2C 에서는 slave의 주소나 slave 에대한 정보를 따로 셋팅해주어야 하잖아요 !

W7500 SPI는 그냥 일방적으로 보내기만 하면 되는건가요 ~ ?

SPI통신은 Master가 CS신호로 Slave를 선택하기 때문에 CS핀을 연결하셔서 1->0으로 떨어뜨려 주셔야합니다~
그렇게되면 해당 Slave가 선택되었다고 생각해 통신을 하게됩니다.

감사합니다. :slight_smile:

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.