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.13 11:43

PSOC의 단점이자 장점

PLD 기반이기에 CPLD나 FPGA 제품처럼 디바이스를 변경하여 사용할 수 있는 부분입니다.

초기에 판매했던 개발보드와 나중에 판매하는 개발보드가 이름은 동일한데 칩이 변경되거나 기제품을 단종시켜버려서 넘어가야 하는 경우가 있어 난처할 때가 있습니다.

그럴때 디바이스를 아래와 같이 변경하여 사용하면 됩니다.

 

변경되는 화면이 일반 펌웨어 엔지니어들에게는 조금 생소합니다.

Keil이나 IAR 등에서도 IC를 변경하여 설정하고 사용하는 것이 있지만 그 선택하는 부분이 알테라의 디바이스 변경과 더 비슷한 느낌입니다. 사용하시는 분들은 당연히 아시겠지만 PLD와 MCU의 조합이기 때문입니다.

요즘 나오는 징크같은 칩을 보면 PSOC과 비슷하다는(사용법이 아닌 방식이) 느낌을 느낄 수 있습니다.

PSOC은 MCU에 더 중점을 뒀고 징크같은 경우는 PGA에 더 중점을 둔 것같습니다.(집적화가 갈수록 잘되니 남는 공간에 Core를 박아볼까? 이런 기분)

사이프레스에서 PSOC을 기존에도 그리고 현재에도 그리 중점적인 제품으로 생각하지 않는다는 느낌이라서 나중되면 매리트가 완전 사라지지 않을까라는 생각도 드네요. ㅠㅠ

 

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 엔지니어 로망와니

댓글을 달아 주세요

2019.04.10 09:04

터치 패드를 구현하면서 터치쪽에 가이드를 보니 Mesh GND의 사용을 추천하였습니다.

그래서 일반 GND와 Mesh GND를 나눠서 설정해보았습니다.

 

 

Mesh GND 설정

 

일반 GND 설정

 

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

댓글을 달아 주세요

2019.04.06 19:36

아트웍을 하려다 보니 내부테스트 제품인 것도 있지만 양산을 타도 저가 타겟 제품에 칩안테나를 사서 달기엔 아깝고(전파 도달거리가 길 필요도 없고 출력도 약하고) 안테나 설계 이런거 없이 빠르게 진행하는 게 답이겠다 생각했습니다.

그래서 같은 주파수를 사용하는 업체의 레퍼런스회로에 패턴 안테나를 가져와야겠다고 생각했습니다.(2.4G 대역은 참 많네요. 일부 회사는 안테나 특성에 대한 자료도 같이 제공합니다.)

찾은 PCB 파일을 얼른 열어서 "스윽" 하고 안테나를 복사해서 라이브러리에 복사해서 붙였는데 안되는 겁니다. 

오잉? 하고 속성을 보니 COPPER 바로 2D 라인으로 바꿔서 긁어온 다음 부품으로 만들어서 저장했습니다. 터미널이 3, 4에서 마지막에 1, 2가 된건 꼼수 쓰다가 나중에 발견하고 바꿨습니다.

 

1. 레퍼런스 보드를 열어서 안테나의 속성을 2D Line로 변경합니다.

 

 

 

2. 복사해서 새 라이브러리에 복사해서 넣고 터미널을 삽입해 준 후 2D Line로 변경하였던 안테나 속성을 다시 Copper로 변경합니다.

 

 

3. 터미널을 선택한 후 마우스 우측을 클릭해 Associate를 클릭하고 합칠 Copper을 선택합니다.

 

 

 

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

댓글을 달아 주세요