w7500 SPI 통신할때 포트 관련 문의입니다.

W7500 SPI 통신 할 때 SE_CLK 설정 하고 오실로스코프로 파형을 찍어보는데 1만 계속 인가되네요…

제가 PB_01 포트로

GPIO_InitDef.GPIO_Pin = GPIO_Pin_1;
GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOB, &GPIO_InitDef);
PAD_AFConfig(PAD_PB,GPIO_Pin_1 , PAD_AF0); (normal function 으로 setting 했습니다)

이렇게 포트 설정을 하고,

GPIO_SetBits(GPIOB, GPIO_Pin_1)
GPIO_ResetBits(GPIOB, GPIO_Pin_1) 로 clk 를 만들어서 보내면 되는거 아닌가요 ??

data send 함수는

#define SetBitSpiPort GPIO_SetBits(GPIOB, GPIO_Pin_3)
#define SetSpiClk GPIO_SetBits(GPIOB, GPIO_Pin_1)
#define ResetBitSpiPort GPIO_ResetBits(GPIOB, GPIO_Pin_3)
#define ResetSpiClk GPIO_ResetBits(GPIOB, GPIO_Pin_1)

void SPI_Send_16(unsigned long data)
{
unsigned char Bit_Cnt;
unsigned int SendBuf;
SendBuf = data;
for (Bit_Cnt = 0; Bit_Cnt < 16; Bit_Cnt++)
{
if ( SendBuf & 0x00000001)
{
SetBitSpiPort ; //
}
else
{
ResetBitSpiPort;
}
SetSpiClk;
SendBuf = SendBuf >>1;
ResetSpiClk;
}
}

식으로 만들어서 Main 에서는

while(1)
{
SPI_Send_16(0x00000000);
Latch_Enable(); // Latch는 PC_06 을 1us delay를 두고 토글 시켰습니다.
}
이런식으로 사용 했습니다.

일단, PB_01 포트에서 오실로스코프로 찍어보니 1만 나오네요.

포트가 고장난건가 싶어서 여쭤봅니다 ! clk는 포트만 열면 자동으로 설정된대로 나가는건가요 … ?

아 그리고 clk 주기를 몇 us 딜레이 정도로 줘야지 안정적이게 나갈까요 ?

안녕하세요.

먼저 저희 SPI = SSP 의 Datasheet를 확인해주세요.아래의 링크를 통해서 확인이 가능합니다.

wizwiki.net/wiki/doku.php?id=pro … herals:ssp

그리고 W7500 예제코드를 참고해주세요.

github.com/Wiznet/W7500

위 링크에서 W7500x_Library_Examples → Projects/Peripheral_Examples → SSP 경로로 접속하셔서

SD_Card_LED or Loopback이 있는데 어느 것이든 상관없습니다.

저는 Loopback 예제를 참고했는데 SSP(SPI)0, SSP1 을 사용하네요. 여기 설정된 것을 토대로

제작하시고 싶으신 것을 제작하시면 될 것 같습니다.

감사합니다.

loop back 모드를 시험삼아서 돌려보니, (receive data 를 허큘러스로 화면에 출력시켜보았습니다.) 데이터가 전혀 넘어가질 않습니다.

SSP1_Buffer_Rx[RxIdx] = (uint16_t)SSP_ReceiveData(SSP1); 여기서 SSP1_Buffer_Rx[RxIdx] 는 모두 0x0000 의 값이 나오더라구요.

loop back example 자체는 안되는 코드인가요 ?

그리고 loop back 예제에서는 도대체 어디서 클럭이 나오는가요… w7500 모든 gpio 포트에 오실로스코프를 찍어봐도

클럭 파형은 잡히않습니다. 코드에서도 클럭에 관한 부분은 아무리 찾아봐도, 데이터 시트를 참고해도 못찾겠습니다.

설명좀 부탁드립니다…ㅠㅠ

loopback 예제는 W7500의 SSP0와 SSP1간의 루프백 예제입니다.

즉 SSP0의 네핀과 SSP1의 네핀을 와이어로 서로 연결을 해줘야한다는 뜻입니다 ^^

SD 예제의 경우에는 내부적으로 SSP1으로 연결된 SD Card 포트에 SD card를 장착후 SD카드와 W7500간 SPI 통신을 하는 것입니다.

즉 위의 예제들은 하드웨어적으로 셋팅을 해줘야 정상 동작하는 예제입니다.

해당 예제안의 readme.md 파일을 참조해 주세요 :slight_smile:

감사합니다.

세세한 답변 너무 감사합니다 :smiley:

이제야 이해가기 시작하네요 … !

제가 혼자하다보니 시행착오가 많네요 ㅠㅠ

죄송하지만 한 가지만 더 여쭤볼게요 !

LOOP BACK 예제에서 SE 신호를 컨트롤하는 코드는 보이지 않더라구요 ~ !

원래 SPI 통신은 slave module 에 데이터를 보낼 때 SE 신호를 1 → 0 으로 인가해주고 데이터전송이 완료되고 0 → 1 로 다시 돌려줘야하잖아요 !

이 예제에서는 그럴 필요가 없는가요 ?

제가 ic chip 에 연결하여 spi 통신을 하려고 하는데 SE 신호를 loop back 예제에서 어떻게 컨트롤하는지 보이질 않아 마지막으로 질문드립니다 ㅠㅠ

안녕하세요 :slight_smile:

구조체 초기화시
SSP_InitStructure.SSP_NSS 부분이 SSP_NSS_Hard 로 셋팅하면 Hardware 적으로 CS핀 신호를 0으로 만들어주게됩니다.
따라서 계속 CS핀이 0을 유지하게되어 계속 데이터 전송이 가능한 상태가 유지되지요.
해당 CS핀을 소프트웨어로 원하시는대로 하고싶으시면 CS 해당 핀을 GPIO로 셋팅하시고 1로 default 셋팅 후 원하실때 0으로 떨어뜨리셔도 됩니다.
실제로도 CS는 GPIO를 많이들 이용하기도 합니다 ^^

감사합니다.