我在一个项目上苦苦挣扎,所以,我在这里。
我的问题是通过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");
或IEC0bits.U1TXIE=0;
或IEC0bits.U1TXIE=0;
禁用它,但没有任何影响......
所以,如果有人知道为什么我有这个问题,我会很高兴= D
干杯。
答案 0 :(得分: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
对于其余的代码,我无法向你解释,我找到了整个块,它就像这样......