最近在做CAN通讯,使用的CAN控制器芯片是mcp2515,写了spi读写mcp2515内部寄存器的函数。代码编写在ccs平台下,版本5.2。就是调试的时候全速运行和单步运行step over时,
结果不对,spi发送的数不对,读出的结果也不对。程序卡在一个地方死循环。
但是单步运行(step into)时,并且函数里面的每一步也运行,结果就是对的。
哎,纠结啊,哪里有问题啊,希望大家帮帮我,哪里出问题了,如果spi接口都搞不定还怎么做CAN通信啊
我把主要函数也列出来吧,是不是程序写的也有问题,
//SPI接口初始化
void SPI_Init(void)
{
ME1 |= USPIE0; // Enable USART0 SPI mode
UCTL0 |= CHAR + SYNC + MM; // 8-bit SPI Master **SWRST**
UTCTL0 |= CKPL + SSEL1 + SSEL0 + STC; // SMCLK, 3-pin mode
UBR00 = 0x02; // UCLK/2
UBR10 = 0x00; // 0
UMCTL0 = 0x00; // no modulation
UCTL0 &= ~SWRST; // Initialize USART state machine
P3SEL |= 0x0E; // P3.1-3 SPI option select
MCP2515_CS_OUTDIR();
MCP2515_SET_CS();
}
//SPI写mcp2515的寄存器
void SPI_WriteReg(uint RegAdr,uint RegData)
{
MCP2515_CLR_CS();
_NOP();
while (!(IFG1 & UTXIFG0));
TXBUF0 = d2510Wrt; //写写指令
while (!(IFG1 & UTXIFG0));
TXBUF0 = RegAdr; //写地址
while (!(IFG1 & UTXIFG0));
TXBUF0 = RegData; //写数据
while (!(IFG1 & UTXIFG0));
_NOP();
MCP2515_SET_CS();
}
//SPI读mcp2515里的寄存器
uint SPI_ReadReg(uint RegAdr)
{
volatile unsigned int temp = 0;
MCP2515_CLR_CS();
_NOP();
RXBUF0 = 0x00; //清接收缓冲
while (!(IFG1 & UTXIFG0));
TXBUF0 = d2510Rd; //写读指令
while (!(IFG1 & UTXIFG0));
TXBUF0 = RegAdr; //写读地址
while (!(IFG1 & UTXIFG0));
TXBUF0 = 0x00; //写1空白字节
while (!(IFG1 & UTXIFG0));
temp = RXBUF0;
_NOP();
MCP2515_SET_CS();
return temp;
}
//SPI复位mcp2515
void SPI_Reset(void)
{
volatile unsigned int temp =0;
MCP2515_CLR_CS();
_NOP();
while (!(IFG1 & UTXIFG0));
TXBUF0 = d2510Reset; //写复位指令
while (!(IFG1 & UTXIFG0));
_NOP();
MCP2515_SET_CS();
do
{
temp = SPI_ReadReg(CANSTAT);
}
while(temp != CAN_Config_Mode);
}
此帖出自
小平头技术问答
通过软件复位mcp2515要小心啊,由于硬件我是直接引出mcp2515的复位引脚,再把它接到单片机的一个引脚上,所以在初始化spi时,应该首先把接到单片机的那个复位引脚置高,不使用硬件复位。
还有我的读mcp2515寄存器的函数SPI_ReadReg写错了,很关键,以前总是读出错误的数,怪不得程序老卡在哪儿。里面最后部分开始是这样写的
while (!(IFG2 & UCB0RXIFG)); //这里的UCB0RXIFG应改为UCB0TXIFG
temp = UCB0RXBUF; //后面这两句位置交换一下就对了
MCP2515_SET_CS();
改好了就是
while (!(IFG2 & UCB0TXIFG)); //判断发送是否完成
MCP2515_SET_CS(); //mcp2515的cs管脚拉高,结束读或者写
temp = UCB0RXBUF; //读接收到的数
嘿嘿,可以继续往后走了
发现CCS还是挺好用的,喜欢这个工具了,帮我找到了错误
一周热门 更多>