comunicación UART entre Cypress FM4 (Cortex M4) y Arduino

1

Estoy tratando de transmitir datos de ( FM4-176L-S6E2CC-ETH Kit de inicio ) para Arduino (Leonardo) mediante la comunicación UART. Conexiones de cable (FM4 [ pág. 8-9 ] - > Arduino):

  

P19 (SOT2_0) - > D10

     

P18 (SIN2_0) - > D11

Para programar FM4, uso Keil uVision5 (5.24.1) con PDL (2.1.0). He activado UART ch.2 en pdl_user.c

#define PDL_PERIPHERAL_ENABLE_MFS2              PDL_ON

e inicializó ambos pines FM4 (P18, P19) para la comunicación mediante una función SetPinFunc_XXX ()

#define SetPinFunc_SIN2_0(dummy)        do{ \
                                            bFM_GPIO_ADE_AN08=0u; \
                                            PINRELOC_SET_EPFR( FM_GPIO->EPFR07, 16u, 2u,  1u ); \
                                            bFM_GPIO_PFR1_P8 = 1u; \
                                        }while (0u)

y

#define SetPinFunc_SOT2_0(dummy)        do{ \
                                            bFM_GPIO_ADE_AN09=0u; \
                                            PINRELOC_SET_EPFR( FM_GPIO->EPFR07, 18u, 2u,  1u ); \
                                            bFM_GPIO_PFR1_P9 = 1u; \
                                        }while (0u)

Cuando subo el código en FM4 (sin errores de compilación), nada se ha transmitido a Arduino, incluso después de presionar el botón de reinicio. ¿Me estoy perdiendo algo?

Si cambio el canal UART a & UART0 y usa SOT0_0 y SIN0_0, puedo ver los datos transmitidos en la consola. También he probado Arduino con el módulo BT y Android, y funciona bien con el mismo código.

FM4-S6E2CC:

#include "mcu.h"
#include "pdl_header.h"

#define SAMPLE_UART_RX_BUFFSIZE sizeof(au8UartTxBuf)/sizeof(char)

volatile stc_mfsn_uart_t* UartCh2 = &UART2;
stc_mfs_uart_config_t stcUartConfig;
uint8_t u8Cnt = 0;

static uint8_t au8UartTxBuf[] = "Data sent from UART2!";

void InitUart(void)
{
   PDL_ZERO_STRUCT(stcUartConfig);

   /* Initialize UART TX and RX channel */
    stcUartConfig.enMode = UartNormal;
    stcUartConfig.u32BaudRate = 9600;
    stcUartConfig.enDataLength = UartEightBits;
    stcUartConfig.enParity = UartParityNone;
    stcUartConfig.enStopBit = UartOneStopBit;
    stcUartConfig.enBitDirection = UartDataLsbFirst; 
    stcUartConfig.bInvertData = FALSE;
    stcUartConfig.bHwFlow = FALSE;
    stcUartConfig.bUseExtClk = FALSE;
    stcUartConfig.pstcFifoConfig = NULL;

    Mfs_Uart_Init(UartCh2, &stcUartConfig);
}

int main(void)
{   
    /* Initialize UART function I/O */
    SetPinFunc_SIN2_0();
    SetPinFunc_SOT2_0();

    /* UART initialization */
    InitUart();

    /* Enable TX function of UART2 */
    Mfs_Uart_EnableFunc(UartCh2, UartTx);

    while(u8Cnt < SAMPLE_UART_RX_BUFFSIZE)
    {
        while (TRUE != Mfs_Uart_GetStatus(UartCh2, UartTxEmpty)); /* wait until TX buffer empty */
        Mfs_Uart_SendData(UartCh2, au8UartTxBuf[u8Cnt]);

        u8Cnt++;
    }

    Mfs_Uart_DeInit(UartCh2, TRUE);

    while(1)
    {
        /* Data is normally sent and received */
    }
}

Leonardo Arduino:

#include <SoftwareSerial.h>
SoftwareSerial UART(10, 11); 
// creates a "virtual" serial port/UART
// connect FM4 pin TX to D10
// connect FM4 pin RX to D11

void setup(){
  UART.begin(9600); // set the data rate for the SoftwareSerial port
}

void loop(){
  if (UART.available())
    Serial.println(UART.read());
}
    
pregunta dlt_w

1 respuesta

0

Encontré el problema gracias a ThreePhaseEel. El documento esquemático (p6) muestra que un conector CN9 tiene Pin109 y Pin110, mientras que para el cableado miré hacia Guía del kit de inicio (p8), que muestra Pin106 y Pin107. Entonces, básicamente tengo que usar otro canal UART, en este caso - ch.12. Cambios que hice:

  

SetPinFunc_SIN12_0 ();

     

SetPinFunc_SOT12_0 ();

     

UartCh2 = & UART12

     

#define PDL_PERIPHERAL_ENABLE_MFS2 PDL_ON

    
respondido por el dlt_w

Lea otras preguntas en las etiquetas