0

我在一个项目上苦苦挣扎,所以我来了。

我的问题是通过 UART 发送数据。事实上,这不是问题,因为我成功发送数据,这要归功于:

 int x=1;
#define var 00000001
        void InitUART()
        {
        mPORTFClearBits(BIT_8);
        TRISFbits.TRISF8=0;        // RF8 output==>TX1
        TRISFbits.TRISF1=1;        // RF1 input==>RX1
        U1STA = 0x1400; // Enable Tx(inv) and Rx
        //U1BRG = 8332; // value = (80000000 / BAUD) - 1 = 9600
        U1MODE = 0x8008; // Enable UART with 1 stop bit, no parity and BRGH
        OpenUART1(UART_EN | UART_BRGH_FOUR, UART_RX_ENABLE | UART_TX_ENABLE,U1BRG(UART1_BAUD) );
        }

int main(void) {

    InitUART;
 while (1)
      {
 x|=var;

              x=x<<1; //=> 0000 0010

               x=x<<1; //=> 0000 0101
               x|=var;

               x=x<<1; //=> 0000 1011
               x|=var;



              x=x<<1; //=> 0001 0110

              x=x<<1; //=> 0010 1101
              x|=var;

              x=x<<1; //=> 0101 1010

              x=x<<1; //=> 1011 0100

                //uart_send_data((BYTE*)x,8);

            U1TXREG=x;
}

而且我接收良好。

但是,我想使用 ChangeNotice 中断。它的代码是这样的,它可以工作:

void InitISR()
{
        SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
        PORTSetPinsDigitalIn(IOPORT_B, BIT_2);          //RB2 as input for CN4 operation
        mPORTBClearBits(BIT_2);
        mCNOpen(CONFIG, PINS, PULLUPS);
       // mCNClearIntFlag();                            // clear interrupt flag
        temp=mPORTBRead();                              // clear port mismatch
        ConfigIntCN(INTERRUPT);                         // enable CN interrupt
        INTEnableSystemMultiVectoredInt();
        TRISEbits.TRISE0= 1;                //E0 input   // SCL EST BRANCHE EN E0/D0
        TRISEbits.TRISE1= 1;                //E1 input   // SDA EST BRANCHE EN E1/D1
        TRISEbits.TRISE2= 0;                //D2 output
        TRISEbits.TRISE3=0;
        LATEbits.LATE2=0;
        LATEbits.LATE3=0;

}

void __ISR(_CHANGE_NOTICE_VECTOR,ipl6) ChangeNotification_Handler(void)
{   
            LATEbits.LATE2=0; //To know
            LATEbits.LATE2=1; // that interrupt
            LATEbits.LATE2=0; // is working

        if ((mPORTEReadBits(BIT_0))!=0) //Check if clock is high==> sending data
        {
            nbr++;
            SDA=mPORTEReadBits(BIT_1);

                           if (SDA==0)       // data =0?
                          {
                                i=i<<1;
                          }
                    else                // data !=0 ==> 1
                          {
                                i=i<<1;
                                i|=var;
                          }              }
     else
    {
             if (nbr==8) // 8bits=>1byte
            {

                 U1TXREG = i;
                    nbr=0;

            }
             else
             {
             }

    }

    temp=mPORTBReadBits(BIT_2);
    mCNClearIntFlag();

}

但是,当我同时做这两件事时,它正在发送一些东西,但根本不是我要寻找的东西,它正在发送(以十六进制表示)000 224 224 000 224 224 00 224 224 000。而不是每个字节接收字节,我每 14 个字节接收 14 个字节。

所以,我虽然 UART 带来了中断,但我试图通过使用asm("di");or IEC0bits.U1TXIE=0;or来禁用它,IEC0bits.U1TXIE=0;但没有任何影响......所以,如果有人知道我为什么会遇到这个问题,我会很高兴 =D

干杯。

4

1 回答 1

0

因此,有一天,我将其发布给可能遇到相同问题的人。问题只是时钟。即使你有一个特殊的石英,你也需要定义你的系统时钟。而且,当你的系统时钟设置好后,你必须定义你的外围时钟,是的,另一个。但要小心,我认为并非所有外围引脚都可以在外围时钟上工作。

所以,我有一个 48Mhz 石英,我的代码在这里:

  //48Mhz
//I want SYS_CLOKC=40Mhz
    #pragma config UPLLEN   = OFF   // USB PLL Enabled, OFF si quartz 48 MHz
    #pragma config FPLLIDIV = DIV_12 // PLL Input Divider, il faut obtenir 
                                     //      entre 4 et 5 MHz
    #pragma config FPLLMUL  = MUL_20        // PLL Multiplier
    #pragma config FPLLODIV = DIV_2         // PLL Output Divider


    // périphérique clock 5Mhz = SYSCLK/FPBDIV
    #pragma config FPBDIV   = DIV_8         // Peripheral Clock divisor


    // oscillateur : Primary Osc w/PLL (XT+,HS+,EC+PLL)
    #pragma config POSCMOD  = HS            // Primary Oscillator
    #pragma config FNOSC    = PRIPLL        // Oscillator Selection
    #pragma config FWDTEN   = OFF           // Watchdog Timer
    #pragma config CP       = OFF           // Code Protect

48/12=4MHz

4*20=80MHz

80/2=40Mhz System_CLOCK=40Mhz

40/8=5Mz 外设时钟=5Mhz

对于其余的代码,我无法向您解释,我找到了整个代码块,它的工作原理是这样的......

于 2015-07-17T06:27:57.827 回答