请教:430串口SPI连接MCP2510通讯时灵时不灵的问题!!

ahjxxy   2005-8-17 22:01 楼主
按精华区go××in1 的“MCP2510与F149-SPI接口的CAN实现程序 ”加适当修改,p3.0作为片选,使用p.7口连接INT脚来进行接收中断,发送不中断。在使用环回模式时,有时有数据回发且正确,读状态寄存器值也正确,但莫名其妙的又不行了。我在写函数里加了一段延时有一段时间正确但过后又行了,麻烦哪位给我看看。。
void w_cmd(uchar add,uchar data,uchar d_long)
{
uchar ii;
P3OUT &=~ BIT0;
TXBUF0=0x02;
while (!(UTCTL0 & TXEPT));
for(i=0;i<100;i++);//延时
TXBUF0=add;
while (!(UTCTL0 & TXEPT));
for(i=0;i<100;i++);//延时
for (ii=0;ii<d_long;ii++)
TXBUF0=data;
while (!(UTCTL0 & TXEPT));
for(i=0;i<100;i++);//延时
}
P3OUT |= BIT0;

}
另外,我怀疑我晶振有问题,8M晶振但不知接两个电容多少PF我使用了15pf的电容,不知够不够,测时钟输出感觉不怎么稳定。下面是MCP2510初始化函数,就这几个啊,实在不知道为什么。
void init_can(void)
{
w_cmd(0x0f,0x87,0x01); //80配置模式
//发送------------
w_cmd(0x2a,0x01,0x01); //CNF1
w_cmd(0x29,0xf1,0x01); //CNF2 位时序
w_cmd(0x28,0x05,0x01); //CNF3

w_cmd(0x0d,0x07,0x01); //芯片发送引脚使能设置
w_cmd(0x31,0x00,1); //发送标识符0000,0000,000,标准帧
w_cmd(0x32,0x00,1);
w_cmd(0x35,0x08,0x01); //数据长度8位

//接受------------
w_cmd(0x60,0x60,0x01); //0x60关闭屏蔽和滤波,接受所有报文,0x00正常屏蔽滤波
// w_cmd(0x61,0xFE,0x01); //接收标识符1111,1110,000,标准帧
// w_cmd(0x62,0x00,0x01);
w_cmd(0x0c,0x00,0x01); //接收引脚控制使能

w_cmd(0x2b,0x00,0x01); //中断使能(禁止)
w_cmd(0x2c,0x00,0x01); //清中断标志
w_cmd(0x2b,0x01,0x01); //中断使能,开放(修改为接收中断使能,发送不中断0x03)。
w_cmd(0x0f,0x47,0x01); //00正常模式,80配置,40环回
}

回复评论 (7)

还有一个现象,当我把MCP2510断电后,再上电运行程序,成功的概率都比较大,所以猜测可能与复位有关系,在初始化函数里开头加入一2510的复位指令函数,也没什么作用。
void reset_cmd(void)//对TXB0
{
P3OUT &=~ BIT0;
TXBUF0 = 0xC0;
while (!(UTCTL0 & TXEPT));
P3OUT |= BIT0;
}
点赞  2005-8-17 22:07
spi0.0和1.1模式在430里面怎么设置?有点不明白啊
点赞  2005-8-17 22:11
spi0.0和1.1模式知道是怎么回事了。兄弟们,都没做过这东东啊
点赞  2005-8-20 10:30
前期问题基本解决,但总发现报文发送错误,还得看看.
点赞  2005-8-22 15:55
没法帮你,我在一本关于pic的C语言书上看到过,将得还很详细。
点赞  2005-8-23 12:19
谢谢sir5!!!经过不懈努力,终于做出来了。可能有几个问题是这样的原因,现在很稳定了。
点赞  2005-8-31 22:59
不管我设置的是回环模式还是正常模式,但是在调试的时候都能接受到数据这是什么原因,这是为什么呢 ???
点赞  2010-4-19 20:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复