'2019/04/16'에 해당되는 글 3건

  1. 2019.04.16 W7500P - 리셋타이밍
  2. 2019.04.16 W7500P Soft I2C Setting
  3. 2019.04.16 W7500P UART Setting
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 엔지니어 로망와니

댓글을 달아 주세요