PIC32 UART传输故障,无数据传输

PIC32 UART传输故障,无数据传输,uart,rate,transmission,pic32,Uart,Rate,Transmission,Pic32,我试图使用PIC32上的UART1来发送和接收数据,但该端口没有输出任何数据。 我正在使用带有8Mhz晶体的PIC32以太网套件。 对于C语言的编程,我使用的是MPLAB IDE v2.15和XC32 v 1.32 我现在没有可用的示波器,所以我试着用万用表测试,这是非常有限的。当我将仪表连接到UART1 TX引脚时,可以看到一旦执行了initU1例程,引脚从0V变为3.3V,这似乎在工作,但当应该传输位时,我在LCD(LK204-25)上看不到任何东西,我还连接了万用表,没有看到任何电压变化,

我试图使用PIC32上的UART1来发送和接收数据,但该端口没有输出任何数据。 我正在使用带有8Mhz晶体的PIC32以太网套件。 对于C语言的编程,我使用的是MPLAB IDE v2.15和XC32 v 1.32 我现在没有可用的示波器,所以我试着用万用表测试,这是非常有限的。当我将仪表连接到UART1 TX引脚时,可以看到一旦执行了initU1例程,引脚从0V变为3.3V,这似乎在工作,但当应该传输位时,我在LCD(LK204-25)上看不到任何东西,我还连接了万用表,没有看到任何电压变化,它也没有显示任何频率。波特率设置为9600。 我正在使用的代码如下所示,请让我知道应该更改什么以使其正常工作


/*
*文件:main.c
*作者:宏碁
*
*创建于2014年8月27日晚上11:57
*/
#包括
#包括
//#包括
#包括
#包括
/*
* 
*/
#定义CTS1 _RD14
#定义RTS1 _RD15
#定义TRTS1 TRISDbits.TRISD15
#定义BRATE1 368//2083//9600@80MHz,BREGH=1
#定义U_ENABLE1 0x8008//BREGH=1,1个停止,无奇偶校验
#定义U_TX1 0x0400//启用发送,清除所有标志
#定义CTS2\u RF12
#定义RTS2\u RF13
#定义TRTS2 TRISFbits.TRISF13
#定义BRATE22082//9600@80MHz,BREGH=1
#定义U_ENABLE2 0x8008//BREGH=1,1个停止,无奇偶校验
#定义U_TX2 0x0400//启用发送,清除所有标志
char Port1Buffer[100],Port2Buffer[100];
inti1=0,i2=0;
int nextRun1=0,nextRun2=0;
void属性(中断(ipl1),向量(27)))
U1RXInterruptHandler(void)//UART 1接收中断例程
{
if(mU1RXGetIntFlag())
{
//清除RX中断标志
mU1RXClearIntFlag();
//回应我们刚刚收到的
//putcUART1(ReadUART1());
Port1Buffer[i1]=ReadUART1();
i1++;
如果(i1==100){
i1=0;
nextRun1=1;
}
//切换LED以指示UART活动
mPORTDToggleBits(位0);
}
//我们不关心这个问题
if(mU1TXGetIntFlag())
{
mU1TXClearIntFlag();
}
}
void属性(中断(ipl2),向量(41)))
U2RXInterruptHandler(void)//UART 2接收中断例程
{
if(mU2RXGetIntFlag())
{
//清除RX中断标志
mU2RXClearIntFlag();
//回应我们刚刚收到的
//putcUART2(ReadUART2());
Port2Buffer[i2]=ReadUART2();
i2++;
如果(i2==100){
i2=0;
nextRun2=1;
}
//切换LED以指示UART活动
mPORTDToggleBits(位0);
}
//我们不关心这个问题
if(mU2TXGetIntFlag())
{
mU2TXClearIntFlag();
}
}
void initU1(void)
{
U1BRG=BRATE1;//初始化波特率生成器
U1MODE=U_ENABLE1;//初始化UART模块
U1STA=U_TX1;//启用变送器
TRTS1=0;//使RTS成为输出引脚
RTS1=1;//设置RTS默认状态(未就绪)
//配置第1部分(UART_INT_PR1 | UART_RX_INT_EN);
}
void initU2(void)
{
U2BRG=BRATE2;//初始化波特率生成器
U2MODE=U_ENABLE2;//初始化UART模块
U2STA=U_TX2;//启用变送器
TRTS2=0;//使RTS成为输出引脚
RTS2=1;//设置RTS默认状态(未就绪)
配置第2部分(UART_INT_PR2 | UART_RX_INT_EN);
}
无效putU1(字符c)
{
//while(CTS1);
而(U1STAbits.UTXBF);
U1TXREG=c;
}
无效putU2(字符c)
{
while(CTS2);
而(U2STAbits.UTXBF);
U2TXREG=c;
}
无效延迟例程(int-delint){
int delcount=0;
while(delcount
我不能发布我的中断处理程序b/c,因为它太复杂了,但是使用串行端口API,它们就不那么复杂了。另外,我建议使用一个简单的分析器,比如这个(当然是在TTL端使用的)

旁注:如果您使用API,他们会为您处理TRIS和LAT

编辑:添加杂注

#pragma config DEBUG    = OFF           // Background Debugger disabled
#pragma config FPLLMUL = MUL_20         // PLL Multiplier: Multiply by 20
#pragma config FPLLIDIV = DIV_2         // PLL Input Divider:  Divide by 2
#pragma config FPLLODIV = DIV_1         // PLL Output Divider: Divide by 1
#pragma config FWDTEN = OFF             // WD timer: OFF
#pragma config POSCMOD = HS             // Primary Oscillator Mode: High Speed xtal
#pragma config FNOSC = PRIPLL           // Oscillator Selection: Primary oscillator  w/ PLL
#pragma config FPBDIV = DIV_1           // Peripheral Bus Clock: Divide by 1 //Note: Application    FPBDIV = DIV_2
#pragma config BWP = OFF                // Boot write protect: OFF
#pragma config ICESEL = ICS_PGx2        // ICE pins configured on PGx2, Boot write protect OFF.
#pragma config WDTPS    = PS1           // Watchdog Timer Postscale
#pragma config CP = OFF
#pragma config PWP = OFF
#pragma config UPLLEN = ON
#pragma config UPLLIDIV = DIV_2         // USB PLL Input Divider
#pragma config FSRSSEL = PRIORITY_7
#pragma config FMIIEN = OFF
#pragma config FVBUSONIO = OFF          // VBUSON is controlled by the port
#pragma config FETHIO = ON            // external PHY in RMII/alternate configuration
#pragma config FUSBIDIO = OFF           // USB ID controlled by PORT function

非常感谢blsmit,我会在几分钟内尝试它。不过,我只是简单地问一个问题,我猜您使用的是4Mhz xstal?所以对于8Mhz晶体,40000000应该更改为80000000?只是想确保:)我正在以40Mhz运行外围时钟,系统以80MHz运行,因此我的FPLLIDIV==DIV_2。我应该将定义保留在中,这可能更明显,我的不好。当你说你正在以40Mhz运行外围时钟时,这是否意味着你的xstal是40Mhz还是4Mhz?如果我的套件在引脚OSC0和OSCIN上使用8Mhz xstal,它会使我的外围时钟变为40Mhz还是4Mhz外设频率是8Mhz还是80Mhz?系统频率是否总是外设频率的两倍?我的系统是围绕以太网启动器套件设计的,使用相同的8Mhz晶体。这给了我80Mhz的系统时钟。我使用配置位将系统时钟划分为40MHz(FPLLIDIV=DIV_2)。如果您未使用FPLLDIV或设置为DIV_1,则您的外围时钟仍处于80MHzblsmit,您是否可以发布您的pragma语句以进行时钟设置?
void init_serial_port( U32 ulWantedBaud )
{
    unsigned short usBRG;
    /* Configure the UART and interrupts. */
    usBRG = (unsigned short)(( (float)40000000/ ( (float)16 * (float)ulWantedBaud ) ) - (float)0.5);
    OpenUART2( UART_EN, UART_RX_ENABLE | UART_TX_ENABLE | UART_INT_TX | UART_INT_RX_CHAR, usBRG );
    ConfigIntUART2( ( configKERNEL_INTERRUPT_PRIORITY + 1 ) | UART_INT_SUB_PR0 | UART_RX_INT_EN );
    U2STAbits.UTXISEL = 0x00;
}
#pragma config DEBUG    = OFF           // Background Debugger disabled
#pragma config FPLLMUL = MUL_20         // PLL Multiplier: Multiply by 20
#pragma config FPLLIDIV = DIV_2         // PLL Input Divider:  Divide by 2
#pragma config FPLLODIV = DIV_1         // PLL Output Divider: Divide by 1
#pragma config FWDTEN = OFF             // WD timer: OFF
#pragma config POSCMOD = HS             // Primary Oscillator Mode: High Speed xtal
#pragma config FNOSC = PRIPLL           // Oscillator Selection: Primary oscillator  w/ PLL
#pragma config FPBDIV = DIV_1           // Peripheral Bus Clock: Divide by 1 //Note: Application    FPBDIV = DIV_2
#pragma config BWP = OFF                // Boot write protect: OFF
#pragma config ICESEL = ICS_PGx2        // ICE pins configured on PGx2, Boot write protect OFF.
#pragma config WDTPS    = PS1           // Watchdog Timer Postscale
#pragma config CP = OFF
#pragma config PWP = OFF
#pragma config UPLLEN = ON
#pragma config UPLLIDIV = DIV_2         // USB PLL Input Divider
#pragma config FSRSSEL = PRIORITY_7
#pragma config FMIIEN = OFF
#pragma config FVBUSONIO = OFF          // VBUSON is controlled by the port
#pragma config FETHIO = ON            // external PHY in RMII/alternate configuration
#pragma config FUSBIDIO = OFF           // USB ID controlled by PORT function