msp430f1611的spi接口与mcp2515通讯的问题

2019-03-24 12:58发布

最近在做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);
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
spyx07
1楼-- · 2019-03-24 15:16
终于找到问题了
通过软件复位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还是挺好用的,喜欢这个工具了,帮我找到了错误
linda
2楼-- · 2019-03-24 17:04
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章