'초보의 아웅다웅 설계하기/W7500P'에 해당되는 글 8건

  1. 2019.04.24 W7500P - UART 설정
  2. 2019.04.17 W7500P - BOR
  3. 2019.04.16 W7500P - 리셋타이밍
  4. 2019.04.16 W7500P Soft I2C Setting
  5. 2019.04.16 W7500P UART Setting
  6. 2019.04.12 W7500P - SWD와 PA3, PA4
  7. 2018.12.18 Wiznet W7500P Keil에서 J-link(or ST-Link) 사용하여 디버깅
  8. 2018.11.12 Wiznet W7500P의 추가 메모리 사용
2019.04.24 19:19

W7500P에서 UART RX를 인터럽트 구조로 잡은 상태에서 UART를 연결하지 않으니 정상동작을 하지 않았습니다.

때문에 UART RX 단자를 처음 셋팅때 연결되어있는지 확인하고 연결이 되어 있으면 인터럽트로 동작하도록 잡았는데 가만 생각해보니 풀업 설정만 해도 될 것 같았습니다.

void UART_Config(uint8_t uart, uint32_t baud)
{
uint8_t RXStatus = 0;
  GPIO_InitTypeDef GPIO_InitStruct;
UART_InitTypeDef UART_InitStructure;

if(uart == USART_0){
PAD_AFConfig(PAD_PA, GPIO_Pin_14, PAD_AF0); 
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Pad = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStruct);

/* UART Configuration for UART1*/
UART_StructInit(&UART_InitStructure, baud);
UART_Init(UART0,&UART_InitStructure);

// if(RXStatus == 1){
/* Configure Uart1 Interrupt Enable*/
UART_ITConfig(UART0,(UART_IT_FLAG_RXI),ENABLE);
/* NVIC configuration */
NVIC_ClearPendingIRQ(UART0_IRQn);
NVIC_EnableIRQ(UART0_IRQn);
DEBUGPRINT("RXStatus0 %d\r\n", RXStatus);
// }
}
else if(uart == USART_1){
// PAD_AFConfig(PAD_PC, GPIO_Pin_3, PAD_AF1); 
// GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
// GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
// GPIO_InitStruct.GPIO_Pad = GPIO_PuPd_UP;
// GPIO_Init(GPIOC, &GPIO_InitStruct);
// RXStatus = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3);

PAD_AFConfig(PAD_PC, GPIO_Pin_3, PAD_AF0); 
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Pad = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStruct);

/* UART Configuration for UART1*/
UART_StructInit(&UART_InitStructure, baud);
UART_Init(UART1,&UART_InitStructure);

// if(RXStatus == 1){
/* Configure Uart1 Interrupt Enable*/
UART_ITConfig(UART1,(UART_IT_FLAG_RXI),ENABLE);
 /* NVIC configuration */
NVIC_ClearPendingIRQ(UART1_IRQn);
NVIC_EnableIRQ(UART1_IRQn);
// }
}
else if(uart == USART_2){
// PAD_AFConfig(PAD_PC, GPIO_Pin_11, PAD_AF1); 
// GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
// GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
// GPIO_Init(GPIOC, &GPIO_InitStruct);
// RXStatus = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11);

PAD_AFConfig(PAD_PC, GPIO_Pin_11, PAD_AF0); 
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Pad = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStruct);

S_UART_Init(baud);

// if(RXStatus == 1){
S_UART_ITConfig((S_UART_CTRL_RXI),ENABLE); 
 /* NVIC configuration */
NVIC_ClearPendingIRQ(UART2_IRQn);
NVIC_EnableIRQ(UART2_IRQn);
DEBUGPRINT("RXStatus2 %d\r\n", RXStatus);
// }
}
}

'초보의 아웅다웅 설계하기 > W7500P' 카테고리의 다른 글

W7500P - UART 설정  (0) 2019.04.24
W7500P - BOR  (0) 2019.04.17
W7500P - 리셋타이밍  (0) 2019.04.16
W7500P Soft I2C Setting  (0) 2019.04.16
W7500P UART Setting  (0) 2019.04.16
W7500P - SWD와 PA3, PA4  (0) 2019.04.12
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2019.04.17 20:50

리셋타이밍이 잘 맞지 않아서 혹시 BOR도 없을까 싶어 전원을 서서히 올려보았습니다.

역시 동작을 하지 않습니다.

데이터시트상에도 BOR이 언급되어 있지 않네요.

가격이 저렴해서 좋지만 사용 용도를 조금 고민해보아야할 것 같습니다. 

'초보의 아웅다웅 설계하기 > W7500P' 카테고리의 다른 글

W7500P - UART 설정  (0) 2019.04.24
W7500P - BOR  (0) 2019.04.17
W7500P - 리셋타이밍  (0) 2019.04.16
W7500P Soft I2C Setting  (0) 2019.04.16
W7500P UART Setting  (0) 2019.04.16
W7500P - SWD와 PA3, PA4  (0) 2019.04.12
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2019.04.16 14:05

주로 많이들 사용하는 같은 급의(ST, NXP 등등) MCU와 다르게 W7500P의 리셋타이밍에는 문제가 좀 있는 듯 싶습니다.

위즈넷사에서 제공하는 노트에도 명시되어 있는 부분입니다.

20ms를 명시해놓은 걸로 기억하는데 만일 지연 타이밍이 없다면 초기에 동작하지 않을 수 있습니다.

 

일단 R 200K, C 1uF으로 지연시간을 좀 늦추니 동작을 합니다. 

양산시에는 보증할 수 없지만 테스트 용도로는 충분할 것 같습니다.

 

'초보의 아웅다웅 설계하기 > W7500P' 카테고리의 다른 글

W7500P - UART 설정  (0) 2019.04.24
W7500P - BOR  (0) 2019.04.17
W7500P - 리셋타이밍  (0) 2019.04.16
W7500P Soft I2C Setting  (0) 2019.04.16
W7500P UART Setting  (0) 2019.04.16
W7500P - SWD와 PA3, PA4  (0) 2019.04.12
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2019.04.16 11:26

W7500P - Soft I2C Setting

 

 

/* Defines -------------------------------------------------------------------*/
#define I2C_Delay() {delay_us(5);}

/*******************************************************************************
* Function Name : static void I2C_Config(u32 speed)
* Description   : Initialize the i2c port
* Parameters    : None
* Return        : None
*******************************************************************************/
void I2C_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;

/* Enable the GPIO_LED clock */
GPIO_System_ClockEnable(I2C_PORT);

  PAD_AFConfig(I2C_PAD, I2C_SCL, PAD_AF1); 
  PAD_AFConfig(I2C_PAD, I2C_SDA, PAD_AF1); 

/* Configure Led pin as output */
GPIO_InitStruct.GPIO_Pin = I2C_SCL | I2C_SDA;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(I2C_PORT, &GPIO_InitStruct);
}

/*******************************************************************************
* Function Name : 
* Parameters    : 
* Return        : none
* Description   : 
*******************************************************************************/
void I2C_WRITE(unsigned char dat)
{
uint8_t bit_cnt, tmp;
uint8_t bit_value;

for(bit_cnt=0; bit_cnt<8; bit_cnt++)
{
tmp = (dat << bit_cnt) & 0x80;
bit_value = (tmp >> 7) & 0x01;

if(bit_value == 1)
GPIO_SetBits(I2C_PORT,I2C_SDA);
else
GPIO_ResetBits(I2C_PORT,I2C_SDA);

I2C_Delay();
GPIO_SetBits(I2C_PORT,I2C_SCL);
I2C_Delay();
GPIO_ResetBits(I2C_PORT,I2C_SCL);
I2C_Delay();
}
}

/*******************************************************************************
* Function Name : 
* Parameters    : 
* Return        : none
* Description   : 
*******************************************************************************/
void I2C_START(void)
{
GPIO_SetBits(I2C_PORT,I2C_SCL);
I2C_Delay();
GPIO_SetBits(I2C_PORT,I2C_SDA);
I2C_Delay();
GPIO_ResetBits(I2C_PORT,I2C_SDA);
I2C_Delay();
GPIO_ResetBits(I2C_PORT,I2C_SCL);
I2C_Delay();
}

/*******************************************************************************
* Function Name : 
* Parameters    : 
* Return        : none
* Description   : 
*******************************************************************************/
void I2C_STOP(void)
{
GPIO_ResetBits(I2C_PORT,I2C_SDA);
I2C_Delay();
GPIO_SetBits(I2C_PORT,I2C_SCL);
I2C_Delay();
GPIO_SetBits(I2C_PORT,I2C_SDA);
I2C_Delay();
}

/*******************************************************************************
* Function Name : 
* Parameters    : 
* Return        : none
* Description   : 
*******************************************************************************/
void I2C_SEND_ACK(uint8_t bit_value)
{
if(bit_value == 1)
GPIO_SetBits(I2C_PORT,I2C_SDA);
else
GPIO_ResetBits(I2C_PORT,I2C_SDA);

I2C_Delay();
GPIO_SetBits(I2C_PORT,I2C_SCL);
I2C_Delay();
GPIO_ResetBits(I2C_PORT,I2C_SCL);
I2C_Delay();
GPIO_SetBits(I2C_PORT,I2C_SDA);
I2C_Delay();
}

/*******************************************************************************
* Function Name : 
* Parameters    : 
* Return        : none
* Description   : 
*******************************************************************************/
uint8_t I2C_READ(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
uint8_t i_byte, n;

GPIO_SetBits(I2C_PORT,I2C_SDA);
I2C_Delay();


/* Configure I2C1 pins: SDA */
//  PAD_AFConfig(I2C_PAD, I2C_SDA, PAD_AF1); 
GPIO_InitStruct.GPIO_Pin = I2C_SDA;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(I2C_PORT, &GPIO_InitStruct);
I2C_Delay();

for(n=0; n<8; n++)
{
GPIO_SetBits(I2C_PORT,I2C_SCL);
I2C_Delay();

if (GPIO_ReadInputDataBit(I2C_PORT,I2C_SDA)){
i_byte = (i_byte << 1) | 0x01; // msbit first
}
else{
i_byte = i_byte << 1;
}
GPIO_ResetBits(I2C_PORT,I2C_SCL);
I2C_Delay();
}

/* Configure I2C1 pins: SDA */
//  PAD_AFConfig(I2C_PAD, I2C_SDA, PAD_AF1); 
GPIO_InitStruct.GPIO_Pin = I2C_SDA;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(I2C_PORT, &GPIO_InitStruct);
I2C_Delay();

return(i_byte);
}

/*******************************************************************************
* Function Name : 
* Parameters    : 
* Return        : none
* Description   : 
*******************************************************************************/
uint8_t I2C_WAIT_ACK(void)        //Acknowledge
{
GPIO_InitTypeDef  GPIO_InitStruct;

uint8_t ack_bit_value = 0;
uint32_t timeout = 6000 * 10; // 10ms

GPIO_SetBits(I2C_PORT,I2C_SDA);
GPIO_SetBits(I2C_PORT,I2C_SCL);

/* Configure I2C1 pins: SDA */
//  PAD_AFConfig(I2C_PAD, I2C_SDA, PAD_AF1); 
GPIO_InitStruct.GPIO_Pin = I2C_SDA;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(I2C_PORT, &GPIO_InitStruct);
I2C_Delay();

while(GPIO_ReadInputDataBit(I2C_PORT,I2C_SDA) && timeout--);
if(timeout==0) ack_bit_value = 1;

/* Configure I2C1 pins: SDA */
//  PAD_AFConfig(I2C_PAD, I2C_SDA, PAD_AF1); 
GPIO_InitStruct.GPIO_Pin = I2C_SDA;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(I2C_PORT, &GPIO_InitStruct);
I2C_Delay();

GPIO_ResetBits(I2C_PORT, I2C_SCL);

return ack_bit_value;
}

 

'초보의 아웅다웅 설계하기 > W7500P' 카테고리의 다른 글

W7500P - BOR  (0) 2019.04.17
W7500P - 리셋타이밍  (0) 2019.04.16
W7500P Soft I2C Setting  (0) 2019.04.16
W7500P UART Setting  (0) 2019.04.16
W7500P - SWD와 PA3, PA4  (0) 2019.04.12
Wiznet W7500P Keil에서 J-link(or ST-Link) 사용하여 디버깅  (0) 2018.12.18
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2019.04.16 09:25

W7500 UART Setting

 

/*******************************************************************************
* Function Name : 
* Parameters    :  
* Return        : 
* Description   : 
*******************************************************************************/
void UART_Config(uint8_t uart, uint32_t baud)
{
UART_InitTypeDef UART_InitStructure;

if(uart == USART_0){
/* UART Configuration for UART1*/
UART_StructInit(&UART_InitStructure, baud);
UART_Init(UART0,&UART_InitStructure);

    /* Configure Uart1 Interrupt Enable*/
    UART_ITConfig(UART0,(UART_IT_FLAG_RXI),ENABLE);
/* NVIC configuration */
    NVIC_ClearPendingIRQ(UART0_IRQn);
    NVIC_EnableIRQ(UART0_IRQn);
}
else if(uart == USART_1){
/* UART Configuration for UART1*/
UART_StructInit(&UART_InitStructure, baud);
UART_Init(UART1,&UART_InitStructure);

    /* Configure Uart1 Interrupt Enable*/
    UART_ITConfig(UART1,(UART_IT_FLAG_RXI),ENABLE);
     /* NVIC configuration */
    NVIC_ClearPendingIRQ(UART1_IRQn);
    NVIC_EnableIRQ(UART1_IRQn);
}
else if(uart == USART_2){
S_UART_Init(baud);
S_UART_ITConfig((S_UART_CTRL_RXI),ENABLE); 
     /* NVIC configuration */
    NVIC_ClearPendingIRQ(UART2_IRQn);
NVIC_EnableIRQ(UART2_IRQn);
}
}

 

 

 

 

/**
  * @brief  This function handles UART0 Handler.
  * @param  None
  * @retval None
  */

uint8_t ch0, ch1, ch2;
void UART0_Handler(void)
{
    if(UART_GetITStatus(UART0,UART_IT_FLAG_RXI))
    {
        UART_ClearITPendingBit(UART0,UART_IT_FLAG_RXI);
  ch0 = UART_ReceiveData(UART0);

    }
    else if(UART_GetITStatus(UART0,UART_IT_FLAG_TXI))
    {
        UART_ClearITPendingBit(UART0,UART_IT_FLAG_TXI);
    }
}


/**
  * @brief  This function handles UART1 Handler.
  * @param  None
  * @retval None
  */
void UART1_Handler(void)
{
    if(UART_GetITStatus(UART1,UART_IT_FLAG_RXI)){
        UART_ClearITPendingBit(UART1,UART_IT_FLAG_RXI);
  ch1 = UART_ReceiveData(UART1);

    }
    else if(UART_GetITStatus(UART1,UART_IT_FLAG_TXI)){
        UART_ClearITPendingBit(UART1,UART_IT_FLAG_TXI);
    }
}


/**
  * @brief  This function handles UART2 Handler.
  * @param  None
  * @retval None
  */
void UART2_Handler(void)
{
if(S_UART_GetFlagStatus(S_UART_INTSTATUS_RXI)){
S_UART_ClearITPendingBit(S_UART_INTSTATUS_RXI);
ch2 = S_UART_ReceiveData();


}
else if(S_UART_GetFlagStatus(S_UART_INTSTATUS_TXI)){
S_UART_ClearITPendingBit(S_UART_INTSTATUS_TXI);
}
}

 

 

 

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2019.04.12 15:52

사용을 하다가 실수로 사용하지 않는 SWD 단자인 PA3과 PA4를 Out으로 설정하였습니다.

설정 후에는 SWD로 라이팅이 되지 않아 고생했습니다.

몇몇 제품의 경우는 리셋을 누르고 있는 상태에서 라이팅을 누르고 리셋 버튼을 풀어주면 라이팅이 되었는데 W7500P는 그 방법이 되지 않아 고생하다 ISP가 지원된다는 게 갑자기 생각 났습니다.(물론 IO는 안 뽑아놨습니다. ㅠㅠ)

SWD 단자 설정을 다시하고 ISP로 라이팅한 후 다시 SWD를 사용할 수 있었습니다.

칩을 바꿔야하나 하는 갈등을 했었는데... 다행이었습니다. 

 

ARTWORK 하면서도 실수를 했는데.. ST의 LQFP 타입보다 PIN 간격이 좁았습니다......

안보고 그냥 했다가 개망..

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2018.12.18 10:36

위즈넷 W7500P MCU를 Jlink 를 사용하여 디버깅하기 위한 설정


J-Link 사용시



ST-Link 사용시


Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2018.11.12 23:08

이더넷 칩으로 유명한 위즈넷에서 W7500/W7500P에서 보면 최고 48KB까지 SRAM을 사용할 수 있다고 나와있습니다.

SDK를 보면 0x20000000에서 16KB(0x4000)까지 밖에 사용할 수 없는데요.

사용할 수 있는 방법을 찾아보면 Socket 버퍼를 메모리로 사용하는 방법입니다.(신박하네요.)

데이터 시트상에서보면 가상 주소에 물리주소가 겹쳐있는 형태로 되어 있는데 가상 주소가 실제 물리주소보다 크다보니 가상 주소 영역을 넘어가면 물리주소의 0번지부터 되돌아가는 형태로 되어있습니다.

0x461E0000부터 0x461EFFFF까지 잡는다고 해도 실제로는 2KB(0x800)까지밖에 사용하지 못하게 됩니다.

그래도 최대 4KB까지 사용할 수 있는 방법이 있는데요 Socket의 TX와 RX 사이를 겹쳐 잡는 겁니다.

다만 그렇게 되면 사용한 버퍼를 사용하는 소켓은 사용하지 못하게 됩니다.


예제)

START ADDRESS : 0x461EF800 SIZE : 0x1000  => Socket 7

START ADDRESS : 0x4612F800 SIZE : 0x1000  => Socket 6

START ADDRESS : 0x4616F800 SIZE : 0x1000  => Socket 5

START ADDRESS : 0x461AF800 SIZE : 0x1000  => Socket 4

...(3,2,1,0 도 동일하게)


Keil, ds5 등에서는 Scatter 파일 IAR에서는 icf 파일에서 설정해주면 됩니다.


(https://wizwiki.net/wiki/lib/exe/fetch.php?media=:products:w7500:w7500x_rm_v112_20181017_.pdf) 68Page


SDK를 보면서 ST 마이크로사의 STDLIB와 많이 유사한 패턴이 보이네요. 많이 사용하던 칩이라 그런지 눈에 잘 들어와서 좋네요. ㅎㅎ


Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요