IAR EW430 Error[Pe065]: 编译错误信息
#include <msp430x14x.h>
#define uchar unsigned char
#define WRC 0x00 //W_RF_CONFIG
#define uint unsigned int
#define RRC 0x10 //R_RF_CONFIG
#define WTP 0x20 //W_TX_PAYLOAD
#define RTP 0x21 //R_TX_PAYLOAD
#define WTA 0x22 //W_TX_ADDRESS
#define RTA 0x23 //R_TX_ADDRESS
#define RRP 0x24 //R_RX_PAYLOAD
#define TXEN_0 P6OUT &=~BIT2 //使能接收模式
#define TXEN_1 P6OUT |= BIT2 //发射模式
#define TRX_CE_0 P6OUT &=~BIT1 //禁止TX/RX
#define TRX_CE_1 P6OUT |= BIT1 //使能TX/RX
#define PWR_0 P2OUT &=~BIT2 //未上电
#define PWR_1 P2OUT |= BIT2 //芯片瑕电
#define MISO_0 P5OUT &=~BIT2 //从NRF905读0
#define MISO_1 P5OUT |= BIT2 // 读1
#define MOSI_0 P5OUT &=~BIT1 //MCU写0至NRF905
#define MOSI_1 P5OUT |= BIT1 // 写1
#define SCK_0 P5OUT &=~BIT3 //SCK为0
#define SCK_1 P5OUT |= BIT3 // 为1
#define CSN_0 P5OUT &=~BIT0 //使能SPI
#define CSN_1 P5OUT |= BIT0 //禁止
#define AM_0 P2OUT &=~BIT6 //AM为0未检测到地址匹配
#define AM_1 P2OUT |= BIT6 // 为1地址匹配
#define DR_0 P2OUT &=~BIT7 //DR为0数据未就绪
#define DR_1 P2OUT |= BIT7 //为1 就绪
#define CD_0 P2OUT &=~BIT5 //CD为0未收载波
#define CD_1 P2OUT |= BIT5 // 为1收到载波
uchar RFConfig[10] = { //配置寄存器的10个配置字节第0至第9字节
0x01, //频道设置
0x08, //自动重发关,正常模式,输出功率6dB,422.5MHZ
0x44, //收发地址长度都为4字节
0x20, //接收数据长度,32字节
0x20, //发送数据长度,32字节
0x88,
0x88,
0x88,
0x88, //4个字节的地址
0x88, //使能8位校验,16M晶振,输出外部时钟使能500KHZ
};
uchar TxAddress[4]={0x88,0x88,0x88,0x88}; // 4个字节的发送地址
uchar RFRxBuf[32]; //射频接收缓冲区32个字节
uchar RFTxBuf[32]; //射频接收缓冲区32个字节
uchar DATA_BUF;
void NRF905_IO_init(void)
{
P6SEL &= ~(BIT2|BIT1|BIT0); //p6.0, p6.1 ,p6.2为普通IO且都作输出 //
P6DIR |= (BIT2|BIT1|BIT0); //p6.0--PWR_UP,P6.1-TRX_CE,p6.2--TX_EN//
P2SEL &= ~(BIT7|BIT6|BIT5); //P2.5,P2.6,P2.7为普通IO且作输入 //
P2DIR &= ~(BIT7|BIT6|BIT5); //p2.5--CD, p2.6--AM ,p2.7--DR //
P5SEL &= ~(BIT3|BIT2|BIT1|BIT0); //P5.0--CSN P5.2--MISO//
P5DIR |= (BIT3|BIT1|BIT0); //P5.1--MOSI P5.3--SCK//
P5DIR &= ~BIT2;
CSN_1; // SPI禁止
SCK_0; // SCK初始状态为低
PWR_1; // nRF905上电
TRX_CE_0; // nRF905进入待机模式
TXEN_0; // 接收模式
}
void Init_Sys() //系统初始化
{
BCSCTL1 &=~XT2OFF; //启用XT2高速晶体振荡器
do { IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (uint i = 0xFF; i > 0; i--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振,为0时振荡转换完成
BCSCTL2 =SELM1+SELS; // MCLK,SMCLK时钟为XT2
//串口初始设置
P3SEL |=( BIT6|BIT7); // 串口端口--P3.6TX,P3.7RX
P3DIR |= (BIT6|BIT5); // P3.5为485TX/RX使能
P3OUT &= ~BIT5; // 使485初始为接收状态
ME2 = UTXE1 + URXE1; // 使能串口模块1的TX/RX
UCTL1 |= CHAR; //8位字符格式
UTCTL1 |= SSEL1; //时钟源用SMCLK
UBR01 = 0x41; //
UBR11 = 0x03; //波特率为 9.6K
UMCTL1 = 0x49; //平均分布安插3个位,即第0,3,6位(小数*8后约为3)
IE2 |= URXIE1; //使能RX中断
UCTL1 &= ~SWRST; //初始化USART状态机(注意用法)
//=========================NRF905 SPI读函数(IO模拟SPI时序)==================
uchar SpiRead (void)
{
uchar i;
for (i=0;i<8;i++)
{
DATA_BUF=DATA_BUF<<1; // 先读取最高位,保存至最末尾,再通过左移位完成整个字节
SCK_1; // 数据传一位,SPI时钟跳一下(注意读写时的不同用法)
if ((P5IN&BIT2)) // 如果P3.2为高 ,则DATA_BUF的0位为1;否则为0。
{
DATA_BUF |= 0x01;
}
else
{
DATA_BUF &= ~(0x01);
}
SCK_0;
}
return DATA_BUF; // 读完一个字节的值即返给函数SpiRead(void)
}
//=========================NRF905 SPI读写函数(IO模拟SPI时序)==================
void SpiWrite(uchar send)
{
uchar i;
DATA_BUF = 0x00;
DATA_BUF=send; // 把要写的字先送给缓存
for (i=0;i<8;i++)
{
if (((DATA_BUF&0x80) != 0))// 总是发送最高位
{
MOSI_1; // 如果DATA_BUF的最高位为1,则写1;否则写0。
}
else
{
MOSI_0;
}
SCK_1; // 时钟跳一下(注间读与写的不同用法)
DATA_BUF=DATA_BUF<<1; // *DATA_BUF按位左移1位,这时原DATA_BUF的后7位的值均向左
SCK_0; // *移一位,即原第6位成了现在的最高位,以此类推。
}
}
void Delay_ms(uint ms) //毫秒为单位,8MHz为主时钟
{
uint i;
uint j;
for(i = ms;i > 0;i--)
{
for(j = 2667;j > 0;j--);
}
// return;
}
void Delay_us(uint us)//微秒为单位,8MHz为主时钟
{
uint i;
uint j;
nCount = 3;
for(i = us;i > 0;i--)
{
for(j =3;j > 0;j--);
}
//return;
}
void delay(uint s) //
{
uint i;
for(i=0; i<s; i++);
}
//==================================写RF配置寄存器的配置参数================================
void Config905(void)
{
uchar i;
CSN_0; // 使能SPI
SpiWrite(WRC); // 先写写配置寄存器命令
for (i=0;i<10;i++) // 写放配置字,一共要写完配置寄存器里的11个字配置字
{
SpiWrite(RFConfig[i]); // 注:一定是从第0字节写至10字节,这是由NRF905芯片决定的
}
CSN_1; //关闭SPI
}
//=========================NRF905装载地址+数据打包+数据发送=====================
void TxPacket(void)
{
uchar i;
TXEN_1; //TX_EN=1
CSN_0; // 使能SPI
//delay(1000);
SpiWrite(WTP); // 写装载TX有效数据命令
for (i=0;i<32;i++) // 写TX有效数据,从第0字写至31字
{
SpiWrite(RFTxBuf[i]);
}
CSN_1; // 写完后关闭SPI
Delay(1); // 延时
CSN_0; // 再打开SPI
SpiWrite(WTA); // 写入地址要和接收方地址一样(本例中是4个字都是0X88)
for (i=0;i<4;i++) // 4字节地址
{
SpiWrite(TxAddress[i]);
}
CSN_1; // 再关闭SPI
TRX_CE_1; // 开始发射
void Delay_us(12); // while (DR!=1);发射延时12uS以确保发送完毕
TRX_CE_0; // 关闭芯片TX/RX
}
//=========================NRF905接收数据=====================
void RxPacket(void)
{
TXEN_0; //接收模式
TRX_CE_1; //使能接收
//Delay_us(650);
while ((P2IN&BIT7)) //当DR为1
{
TRX_CE_0;
CSN_0; // SPI使能
// Delay(1);
SpiWrite(RRP); // 写读SPI数据命令
for (uchar i = 0 ;i < 32 ;i++)
{
RFRxBuf[i]=SpiRead(); // 读取数据送到RX缓存
}
CSN_1; //禁止SPI
Delay(10);
//TRX_CE_1;
}
}
void main()
{
WDTCTL = WDTPW + WDTHOLD; //禁止看门狗
Init_Sys();
NRF905_IO_init();
_EINT();
while(1)
{
while(!(IFG2&UTXIFG1)) // 若发送缓存为空
{
P3OUT |= BIT5; //(485TX)
RxPacket();
for (uchar i = 0 ;i < 32 ;i++)
{
TXBUF1 = RFRxBuf[i];
}
P3OUT &= ~ BIT5;
}
}
}
#pragma vector = USART1RX_VECTOR
__interrupt void Usart1RX()
{
TxPacket();
P3OUT &= ~ BIT5;
for ( uchar i = 0 ;i < 32 ;i++)
{
RFRxBuf[i] = RXBUF1;
}
}
IAR EW430版本是V4.1的,错误信息是这样的
main.c
Error[Pe065]: expected a ";" J:\自编程NRF905\main.c 95
Warning[Pe012]: parsing restarts here after previous syntax error J:\自编程NRF905\main.c 201
Warning[Pe223]: function "SpiWrite" declared implicitly J:\自编程NRF905\main.c 217
Warning[Pe676]: using out-of-scope declaration of function "SpiRead" (declared at line 94) J:\自编程NRF905\main.c 220
Warning[Pe223]: function "Delay" declared implicitly J:\自编程NRF905\main.c 223
Warning[Pe223]: function "TxPacket" declared implicitly J:\自编程NRF905\main.c 254
Error while running C/C++ compiler
Done. 1 error(s), 5 warning(s)