Независимо от того, что я прошу отправить свою систему, она отправляет только FF и FE

Я создал систему, которая будет считывать данные CANBUS с автомобиля и передавать их по беспроводной сети на «базовую станцию». На данный момент мой код работает в том смысле, что он отправляет вещи по линии данных в xbee, а xbee отправляет их в принимающий модуль, за исключением того, что он отправляет только FF и FE независимо от того, что я прошу его отправить . Любая помощь приветствуется.

main.c

/**
  Section: Included Files
*/
#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/pin_manager.h"
#include "mcc_generated_files/reset.h"
#include "mcc_generated_files/reset_types.h"
#include "mcc_generated_files/system.h"
#include "mcc_generated_files/system_types.h"
#include "mcc_generated_files/traps.h"
#include "mcc_generated_files/uart1.h"
#include "mcc_generated_files/watchdog.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"

void ms_delay (int N)
{
    T1CON = 0x08030;

    int delay = N * 62.5;   // 1 Milisecond => .001 / (256 * (1/16,000,000)) = 62.5
    TMR1 = 0;
    while (TMR1 < delay);
}

int main (void)
{
    PIN_MANAGER_Initialize();
    CLOCK_Initialize();
    INTERRUPT_Initialize();
    //DMA_Initialize();
    UART1_Initialize();
    ECAN1_Initialize();
    //INTERRUPT_GlobalEnable();
    while(1)
        {
        UART1_Write("A");
        ms_delay(2);
        UART1_Write("C");
        ms_delay(2);
        UART1_Write('S');
        ms_delay(2);
        }
}
/**
 End of File
*/

UART1.c

  Section: Included Files
*/
#include "uart1.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 = 2560.164; Frequency = 40000000 Hz; BRG 3905; 
    U1BRG = 0x19;

    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)
    {

    }

    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);
}*/

Ожидаемые результаты: повторная отправка YES из одного модуля в другой. Фактические результаты: повторная отправка FF FE.


person dfetz    schedule 24.04.2019    source источник
comment
Что вам дает пошаговое выполнение кода в отладчике? И почему в вашем посте код закомментирован?   -  person Ken White    schedule 24.04.2019
comment
Это не дает мне никаких ошибок или чего-то еще, когда я запускаю его. Код закомментирован, потому что я пробовал в нем кое-что новое и не хочу вносить какие-либо постоянные изменения, пока не узнаю, что все работает.   -  person dfetz    schedule 24.04.2019
comment
Вы передаете строку в UART1_Write с помощью "A". Это [вероятно] запись первого байта адреса строки (который может быть (например) 0xFF123455), следовательно, FF. Попробуйте (например) UART1_Write('A') вместо этого   -  person Craig Estey    schedule 24.04.2019
comment
даже когда я изменяю его на UART1_Write('A'), он по-прежнему отправляет FE только один раз, хотя он также должен отправлять его постоянно, так как через какое-то время (1), верно?   -  person dfetz    schedule 24.04.2019
comment
вы не передаете uint8 своей функции записи. поместите U1TXREG = 'A, жестко запрограммированное в функции записи, затем = 'B' и т. д., и посмотрите, изменится ли оно, как вы ожидаете. Вы можете поменять местами контакты на своем логическом анализаторе, что приведет к проблемам с кадрированием или ложным краям. Если U1TXREG = 'A' не отправляет значение ascii для 'A', значит, ваша настройка HW неверна, если она отправляет 'A', это ваша маленькая тестовая программа.   -  person Bwebb    schedule 24.04.2019
comment
проверьте скорость передачи. Я не могу уследить за вашим расчетом.   -  person Mike    schedule 24.04.2019
comment
Я попробую U1TXREG = ‘A’, как только доберусь до лаборатории. Что касается скорости передачи данных, я использовал 40000000/(16*9600)-1.   -  person dfetz    schedule 24.04.2019


Ответы (1)


Лучше всего подключить логический пробник или даже осциллограф к линиям TX и RX, чтобы вы могли посмотреть, что вы на самом деле отправляете. Вы сможете посмотреть битовые времена, чтобы убедиться, что вы правильно рассчитали скорость передачи. Все остальное, что вы сделаете, будет просто слепым предположением.

Есть ли на этой платформе Microchip драйвер UART, управляемый прерываниями или DMA, который вы можете использовать вместо собственного? Можете ли вы протестировать свой драйвер с проводным последовательным подключением к ПК вместо XBee (что представляет собой еще одну возможную точку отказа)?

Ваш UART1_Write() блокируется, поэтому нет необходимости в задержке.

Убедитесь, что вы настроили XBee на правильную скорость передачи данных (я почти уверен, что ATBD=3 для 9600). Попробуйте отправить последовательность 0x01, 0x03, 0x07 0x0F, 0x1F, 0x3F, 0x7F, 0xFF. Это генерирует последовательность битов 1, за которыми следуют биты 0, и может помочь устранить ошибку в вычислении скорости передачи данных.

person tomlogic    schedule 25.04.2019