Попытка заставить UART работать на dsPIC33EV256GM102 - PullRequest
0 голосов
/ 11 апреля 2019

Я работаю над проектом, который требует связи UART между dsPIC и модулем xbee.Когда я запускаю код, который у меня есть, он компилирует и программирует, но ничего не отправляет по линии UART.Я просто пытаюсь получить что-то для передачи по этой сигнальной линии, а затем обработаю это оттуда.Ниже приведен мой основной код, а также мой UART1.c, оба изначально были созданы MCC в MPLABx.Спасибо всем заранее.

#include "mcc_generated_files/system.h"
#include "mcc_generated_files/uart1.h"
#include "mcc_generated_files/pin_manager.h"
#include "mcc_generated_files/clock.h"
#include "mcc_generated_files/dma.h"
#include "mcc_generated_files/ecan1.h"
#include "mcc_generated_files/interrupt_manager.h"
#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/reset.h"
#include "mcc_generated_files/reset_types.h"
#include "mcc_generated_files/system_types.h"
#include "mcc_generated_files/traps.h"
#include "mcc_generated_files/watchdog.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"

int count = 1, i;
char string[30];

int main (void)
{
    UART1_Initialize();

    while(1)
    {
    printf(string,"c");   //
        for(i = 0;i<sizeof(string);i++)
        {
            UART1_Write(string[i]);
        }
        count = count + 1;
    }

} 

UART1.c

#include "uart1.h"
#include <stdbool.h>
#include <stdint.h>

/**
  Section: UART1 APIs
*/

void UART1_Initialize(void)
{
/**    
     Set the UART1 module to the options selected in the user interface.
     Make sure to set LAT bit corresponding to TxPin as high before UART 
initialization
*/
    // STSEL 1; IREN disabled; PDSEL 8N; UARTEN enabled; RTSMD disabled; 
USIDL disabled; WAKE disabled; ABAUD disabled; LPBACK disabled; BRGH 
enabled; URXINV disabled; UEN TX_RX; 
    // Data Bits = 8; Parity = None; Stop Bits = 1;
    U1MODE = (0x8008 & ~(1<<15));  // disabling UARTEN bit
    // UTXISEL0 TX_ONE_CHAR; UTXINV disabled; OERR NO_ERROR_cleared; URXISEL 
RX_ONE_CHAR; UTXBRK COMPLETED; UTXEN disabled; ADDEN disabled; 
    U1STA = 0x00;
    // BaudRate = 9600; Frequency = 40000000 Hz; BRG 1041; 
    U1BRG = 0x411;

    U1MODEbits.UARTEN = 1;  // enabling UARTEN bit
    U1STAbits.UTXEN = 1; 
}

uint8_t UART1_Read(void)
{
    while(!(U1STAbits.URXDA == 1))
    {

    }

    if ((U1STAbits.OERR == 1))
    {
        U1STAbits.OERR = 0;
    }

    return U1RXREG;
}

void UART1_Write(uint8_t txData)
{
    while(U1STAbits.UTXBF == 1)
    {

    }

    U1TXREG = txData;    // Write the data byte to the USART.
}

uint16_t UART1_StatusGet (void)
{
    return U1STA;
}

int __attribute__((__section__(".libc.write"))) write(int handle, void 
*buffer, unsigned int len) {
    int i;
    while(U1STAbits.TRMT == 0);  
    for (i = len; i; --i)
    {
        while(U1STAbits.TRMT == 0);
        U1TXREG = *(char*)buffer++;        
    }
    return(len);
}

1 Ответ

1 голос
/ 12 апреля 2019

Редактировать : Я забыл, что C инициализирует нулями глобальные массивы , это означает, что ваша переменная string будет состоять только из символов NULL.

Ваш вызов printf также выглядит подозрительно: printf(string, "c");.Вы пытаетесь напечатать строку и заполнить первую переменную в строке буквой "c", но строка никогда не инициализировалась?

Как узнать, что ничего не отправляется, у вас подключен логический анализатор?к контактам UART?Если это так, это может быть полезно добавить.

...