最近在做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);
}
此帖出自
小平头技术问答
一周热门 更多>