共2条
1/1 1 跳转至页
MCP2510,F149,SPI,CAN 大家帮看看MCP2510与F149-SPI接口的CAN实现程序
问
楼下我贴出来有正确的调试通过了的代码了,这个错的我也留下来当给大家对比用的吧。
//operating SPI PORTS --CAN
#include "MSP430x14x.h"
#include "foshan.h"
uchar Data[5];
uchar i=0,rx_data,P=1;
/*---------------------初始化---------------------------*/
void init_spi(void)
{
int i;
WDTCTL = WDTPW + WDTHOLD; //off watchdog
/*--------------------------设置主时钟为TX2-------------*/
do
{
IFG1 &=~OFIFG; //清OFIFG中断
for (i = 0xff; i>0; i--);
}
while ((IFG1 & OFIFG) != 0);
BCSCTL1 &= ~XT2OFF;
BCSCTL2 |= (SELM1 + SELS); // 0x80|0x08|0x02 mclk=8 MHz
/*--------------------------SPI-x0 初始化------------------*/
UCTL0 &=~ SWRST; //starting USART1_init
UCTL0 |= CHAR+SYNC+MM; //spi主模式,8位数据
UTCTL0 = STC + SSEL1 + SSEL0 + CKPL; //+ CKPH; 3线模式,选SMCLK时钟
UBR00 = 0x20; //1MHz 8MHz
UBR10 = 0x03;
UMCTL0 = 0x00;
ME1 |= USPIE0; //SPI模块允许
P3SEL |= 0x0F; //active P3.0 & P3.3 for SPI
P3DIR |= 0x0A; //P3.1(SIMO)& P3.3(UCLK)
//UCTL0 &=~SWRST; //endding USART0_init
IE1 |= URXIE0;
UCTL0 &=~ SWRST;
}
/*----------------接收中断---------------------------------*/
interrupt[UART0RX_VECTOR] void UART0RX(void)
{
rx_data=RXBUF0;
Data[i]=rx_data;
i++;
if (i>8) i=0;
//TXBUF0 = 0;
}
/*--------------------读数据指令---------------------------*/
void r_cmd(uchar add)
{
//P2OUT &=~ BIT0;
TXBUF0=0X03; //0x03;
while (!(UTCTL0 & TXEPT));
TXBUF0=add;
while (!(UTCTL0 & TXEPT));
//P2OUT = BIT0;
//TXBUF0 = 0;
//while (UTCTL0 & TXEPT);
}
/*--------------------写数据指令---------------------------*/
void w_cmd(uchar add,uchar data)
{
//P2OUT &=~ BIT0;
TXBUF0=0x02;
while (!(UTCTL0 & TXEPT));
TXBUF0=add;
while (!(UTCTL0 & TXEPT));
TXBUF0=data;
while (!(UTCTL0 & TXEPT));
//P2OUT = BIT0;
}
/*--------------------开始发送指令-------------------------*/
void t_cmd(uchar buf_add)
{
P2OUT &=~ BIT0;
TXBUF0 = 0x80+buf_add;
while (!(UTCTL0 & TXEPT));
P2OUT = BIT0;
}
/*----------------延时------------------------------------*/
void delay(uint i)
{
uint j, k;
for (j=0; j < i; j++)
{
for(k = 0; k<500; k++);
}
}
/*-----------------------MAIN-----------------------------*/
void main(void)
{
init_spi();
_EINT();
P2SEL = 0x00;
P2DIR = 0x01;
P2OUT = 0xFF;
P2OUT &=~ BIT0;
TXBUF0 = 0XC0; // 0XC0是2510的复位指令
delay (500); //这里是怕2510复位时间不够加的
while(1)
{
w_cmd (0x0F,0x80);//2510 写指令,0X0F地址写入0X80,这样2510时钟OUTCLK就该关上了
r_cmd (0x0F);//这里读0X0F的内容
}
}
-------------------------------------------------------------------------------------------------
现象:2510没反应,我单独把430一侧的SIMO和SOMI电路短路了,自收自发来测试程序,变量Data[]中数据正确。
接好2510后示波器观察发送数据正确,2510时钟正确,OUTCLK正确。怀疑SPI 的时钟触发沿相位不对,也把CKPL和 CKPH两位进行了各种组合。
另!!!不考虑2510损坏,原因:昨天用最简单的指令TXBUFF=0XAA疯狂写数据做示波器信号测试时,2510有回发数据,但是变量没收到。
我怀疑我还是SPI和2510的组合时序没弄对,可是手里就这么点资料了。哪个哥们弄过2510的帮我看看 答 1: 哈哈哈哈,调试通过了。等我把程序收拾利索了在发上来! 答 2: 你的MCP2510在那里买的?另外,你用到了CAN收发器码? 答 3: 采购办买回来的,本来我要PID封装的好做实验,可惜PID的没货了。我只好拿表贴的和集成电路插座一起焊了个PID的。呵呵呵呵
CAN收发器当然要用了,2510的驱动能力不够,必须要驱动。 答 4: 我在北京,也F149控制MCP2510, 想找表贴封装的,好像PCA82C250和MCP2551都是5伏供电,不知能否工作在3.3V? 请指教!我的邮箱
micaosohu.com 答 5: 工作电压3V--5.5V 答 6: 哦准备的是2510用3.3V,中间光藕,然后82C250隔离开的5V。2510可以起到3.3V-5V的桥梁作用(我是用光藕把电源隔离开了),现在工作已经可以了。2510和430的SPI口在3.3V下,我用到了1M ,最高1.几 M 吧。在设高了就乱数据了。不知道是不是3.3V 的极限速度。等有时间了再测试测试。
表贴件北京有,随便你网上查下就可以找到。到是PID 的不好买。 答 7: 还请斑竹早日上船程序,小弟项目紧急,初次使用430和2510,还请多多指教 答 8: 楼主,可否分享一下您调试的资料,请问在CAN总线中的收发器与mcp2510间可否不用光藕隔离而直接连接阿? 还请搂住再发表一下成功调试的code,万分感谢! 答 9: //operating SPI PORTS --CAN
#include "MSP430x14x.h"
#include "foshan.h"
uchar Data[20];
uchar i=0,rx_data;
unsigned long int P=1;
/***********************初始化****************************/
void init_spi(void)
{
int i;
WDTCTL = WDTPW + WDTHOLD; //off watchdog
/*设置主时钟为TX2-------------*/
do
{
IFG1 &=~OFIFG; //清OFIFG中断
for (i = 0xff; i>0; i--);
}
while ((IFG1 & OFIFG) != 0);
BCSCTL1 &= ~XT2OFF;
BCSCTL2 |= (SELM1 + SELS); // 0x80|0x08|0x02 mclk=8 MHz
/*SPI-x0 初始化--------------*/
UCTL0 &=~ SWRST; //starting USART1_init
UCTL0 |= CHAR+SYNC+MM; //spi主模式,8位数据
UTCTL0 = STC + SSEL1 + SSEL0 + CKPL;// + CKPH; //3线模式,选SMCLK时钟
UBR00 = 0x08; //1MHz 8MHz
UBR10 = 0x00;
UMCTL0 = 0x00;
ME1 |= USPIE0; //SPI模块允许
P3SEL |= 0x0F; //active P3.0 & P3.3 for SPI
P3DIR |= 0x0A; //P3.1(SIMO)& P3.3(UCLK)
//UCTL0 &=~SWRST; //endding USART0_init
IE1 &=~ URXIE0; //IE1 |= URXIE0; //接收中断允许
UCTL0 &=~ SWRST;
}
/*--------------------读数据指令---------------------------*/
void r_cmd(uchar add,uchar d_long)
{
uchar ii;
P2OUT &=~ BIT0;
TXBUF0=0x03; //0x03;
while (!(UTCTL0 & TXEPT));
TXBUF0=add;
while (!(UTCTL0 & TXEPT));
for (ii=0;ii
{
TXBUF0=0;
while (!(UTCTL0 & TXEPT));//判断发送数据完成
//while (!(IFG1 & URXIFG0));//判断接收数据到位
Data[ii]=RXBUF0;
}
P2OUT |= BIT0;
}
/*--------------------写数据指令---------------------------*/
void w_cmd(uchar add,uchar data,uchar d_long)
{
uchar ii;
P2OUT &=~ BIT0;
TXBUF0=0x02;
while (!(UTCTL0 & TXEPT));
TXBUF0=add;
while (!(UTCTL0 & TXEPT));
for (ii=0;ii
{
TXBUF0=data;
while (!(UTCTL0 & TXEPT));
}
P2OUT |= BIT0;
}
/*--------------------开始发送指令-------------------------*/
void t_cmd(void)
{
P2OUT &=~ BIT0;
TXBUF0 = 0x81;
while (!(UTCTL0 & TXEPT));
P2OUT = BIT0;
}
//---------------------------//////
void init_CAN(void);
/*-----------------------MAIN-----------------------------*/
void main(void)
{
init_spi();
_EINT();
P2SEL = 0x00;
P2DIR = 0x01;
P2OUT = 0xFF;
init_CAN();
w_cmd(0x31,0xaa,13);
w_cmd(0x35,0x08,1);
t_cmd();
while(1)
{
r_cmd(0x60,0x0f);
//r_cmd(0x00);
}
while(1);
}
/*------------------CAN初始化---------------------*/
void init_CAN(void)
{
w_cmd(0x0f,0x80,0x01); //80配置模式
//发送------------
w_cmd(0x2a,0x00,0x01); //CNF1
w_cmd(0x29,0xf1,0x01); //CNF2 位时序
w_cmd(0x28,0x05,0x01); //CNF3
w_cmd(0x0d,0x07,0x01); //芯片发送引脚使能设置
//接受------------
w_cmd(0x60,0x60,0x01); //0x60关闭屏蔽和滤波,接受所有报文,0x00正常屏蔽滤波
w_cmd(0x0c,0x00,0x01); //接收引脚控制使能
w_cmd(0x2b,0x00,0x01); //中断使能
w_cmd(0x2c,0x00,0x01); //中断标志
w_cmd(0x0f,0x40,0x01); //0正常模式,80配置,40环回
}
---------------------------------------------------------------------------------------------
这个是调试通过了的SPI & CAN2510全部完整程序了,初始化430的SPI、2510,读指令、写指令、发送指令(读、写都可以一次发送N 条,因为2510有连续操作的能力)
/*--------------------写数据指令---------------------------*/
void w_cmd(uchar add,uchar data,uchar d_long)
变量 d_long 就是长度(读指令相同)
我用了光藕的,不用光藕直接连接应该没问题,2510的工作电压可以到5V ,所以可以直接用。 答 10: 忘了说,我都没用中断进行传送控制,电路设计的是用P2。3吧,拿来做2510的缓冲满中断。
这个程序应该很好的实现了430通过SPI 口对2510的指令数据传送了,具体到实际应用,只需要修改程序结构和按实际网络传输比特率来对MCP2510初始化就可以了。我的项目因采购这不是放假嘛,没给我买到DC-DC,所以PCB没元件封装出不来,只有一块板子做实验,没办法望下编程进行连机调试,所以就实验到了这里。
SPI 设定1M ,2510的位时序应该是125K 吧。过个节都快忘光了。呵呵呵呵
希望对你有帮助,对大家都有帮助吧!! 答 11: 很好!多谢。 答 12: 应该置顶,版主无私的奉献 答 13: 有需要2510中文手册的可以在此留话,我好象记得有人要过。 答 14: 大侠真是一个热心肠的人!
呵呵,本人想求大虾一份2510的中文资料,求大虾帮忙!不胜感谢!
我的信箱:lzqbb163.com
//operating SPI PORTS --CAN
#include "MSP430x14x.h"
#include "foshan.h"
uchar Data[5];
uchar i=0,rx_data,P=1;
/*---------------------初始化---------------------------*/
void init_spi(void)
{
int i;
WDTCTL = WDTPW + WDTHOLD; //off watchdog
/*--------------------------设置主时钟为TX2-------------*/
do
{
IFG1 &=~OFIFG; //清OFIFG中断
for (i = 0xff; i>0; i--);
}
while ((IFG1 & OFIFG) != 0);
BCSCTL1 &= ~XT2OFF;
BCSCTL2 |= (SELM1 + SELS); // 0x80|0x08|0x02 mclk=8 MHz
/*--------------------------SPI-x0 初始化------------------*/
UCTL0 &=~ SWRST; //starting USART1_init
UCTL0 |= CHAR+SYNC+MM; //spi主模式,8位数据
UTCTL0 = STC + SSEL1 + SSEL0 + CKPL; //+ CKPH; 3线模式,选SMCLK时钟
UBR00 = 0x20; //1MHz 8MHz
UBR10 = 0x03;
UMCTL0 = 0x00;
ME1 |= USPIE0; //SPI模块允许
P3SEL |= 0x0F; //active P3.0 & P3.3 for SPI
P3DIR |= 0x0A; //P3.1(SIMO)& P3.3(UCLK)
//UCTL0 &=~SWRST; //endding USART0_init
IE1 |= URXIE0;
UCTL0 &=~ SWRST;
}
/*----------------接收中断---------------------------------*/
interrupt[UART0RX_VECTOR] void UART0RX(void)
{
rx_data=RXBUF0;
Data[i]=rx_data;
i++;
if (i>8) i=0;
//TXBUF0 = 0;
}
/*--------------------读数据指令---------------------------*/
void r_cmd(uchar add)
{
//P2OUT &=~ BIT0;
TXBUF0=0X03; //0x03;
while (!(UTCTL0 & TXEPT));
TXBUF0=add;
while (!(UTCTL0 & TXEPT));
//P2OUT = BIT0;
//TXBUF0 = 0;
//while (UTCTL0 & TXEPT);
}
/*--------------------写数据指令---------------------------*/
void w_cmd(uchar add,uchar data)
{
//P2OUT &=~ BIT0;
TXBUF0=0x02;
while (!(UTCTL0 & TXEPT));
TXBUF0=add;
while (!(UTCTL0 & TXEPT));
TXBUF0=data;
while (!(UTCTL0 & TXEPT));
//P2OUT = BIT0;
}
/*--------------------开始发送指令-------------------------*/
void t_cmd(uchar buf_add)
{
P2OUT &=~ BIT0;
TXBUF0 = 0x80+buf_add;
while (!(UTCTL0 & TXEPT));
P2OUT = BIT0;
}
/*----------------延时------------------------------------*/
void delay(uint i)
{
uint j, k;
for (j=0; j < i; j++)
{
for(k = 0; k<500; k++);
}
}
/*-----------------------MAIN-----------------------------*/
void main(void)
{
init_spi();
_EINT();
P2SEL = 0x00;
P2DIR = 0x01;
P2OUT = 0xFF;
P2OUT &=~ BIT0;
TXBUF0 = 0XC0; // 0XC0是2510的复位指令
delay (500); //这里是怕2510复位时间不够加的
while(1)
{
w_cmd (0x0F,0x80);//2510 写指令,0X0F地址写入0X80,这样2510时钟OUTCLK就该关上了
r_cmd (0x0F);//这里读0X0F的内容
}
}
-------------------------------------------------------------------------------------------------
现象:2510没反应,我单独把430一侧的SIMO和SOMI电路短路了,自收自发来测试程序,变量Data[]中数据正确。
接好2510后示波器观察发送数据正确,2510时钟正确,OUTCLK正确。怀疑SPI 的时钟触发沿相位不对,也把CKPL和 CKPH两位进行了各种组合。
另!!!不考虑2510损坏,原因:昨天用最简单的指令TXBUFF=0XAA疯狂写数据做示波器信号测试时,2510有回发数据,但是变量没收到。
我怀疑我还是SPI和2510的组合时序没弄对,可是手里就这么点资料了。哪个哥们弄过2510的帮我看看 答 1: 哈哈哈哈,调试通过了。等我把程序收拾利索了在发上来! 答 2: 你的MCP2510在那里买的?另外,你用到了CAN收发器码? 答 3: 采购办买回来的,本来我要PID封装的好做实验,可惜PID的没货了。我只好拿表贴的和集成电路插座一起焊了个PID的。呵呵呵呵
CAN收发器当然要用了,2510的驱动能力不够,必须要驱动。 答 4: 我在北京,也F149控制MCP2510, 想找表贴封装的,好像PCA82C250和MCP2551都是5伏供电,不知能否工作在3.3V? 请指教!我的邮箱
micaosohu.com 答 5: 工作电压3V--5.5V 答 6: 哦准备的是2510用3.3V,中间光藕,然后82C250隔离开的5V。2510可以起到3.3V-5V的桥梁作用(我是用光藕把电源隔离开了),现在工作已经可以了。2510和430的SPI口在3.3V下,我用到了1M ,最高1.几 M 吧。在设高了就乱数据了。不知道是不是3.3V 的极限速度。等有时间了再测试测试。
表贴件北京有,随便你网上查下就可以找到。到是PID 的不好买。 答 7: 还请斑竹早日上船程序,小弟项目紧急,初次使用430和2510,还请多多指教 答 8: 楼主,可否分享一下您调试的资料,请问在CAN总线中的收发器与mcp2510间可否不用光藕隔离而直接连接阿? 还请搂住再发表一下成功调试的code,万分感谢! 答 9: //operating SPI PORTS --CAN
#include "MSP430x14x.h"
#include "foshan.h"
uchar Data[20];
uchar i=0,rx_data;
unsigned long int P=1;
/***********************初始化****************************/
void init_spi(void)
{
int i;
WDTCTL = WDTPW + WDTHOLD; //off watchdog
/*设置主时钟为TX2-------------*/
do
{
IFG1 &=~OFIFG; //清OFIFG中断
for (i = 0xff; i>0; i--);
}
while ((IFG1 & OFIFG) != 0);
BCSCTL1 &= ~XT2OFF;
BCSCTL2 |= (SELM1 + SELS); // 0x80|0x08|0x02 mclk=8 MHz
/*SPI-x0 初始化--------------*/
UCTL0 &=~ SWRST; //starting USART1_init
UCTL0 |= CHAR+SYNC+MM; //spi主模式,8位数据
UTCTL0 = STC + SSEL1 + SSEL0 + CKPL;// + CKPH; //3线模式,选SMCLK时钟
UBR00 = 0x08; //1MHz 8MHz
UBR10 = 0x00;
UMCTL0 = 0x00;
ME1 |= USPIE0; //SPI模块允许
P3SEL |= 0x0F; //active P3.0 & P3.3 for SPI
P3DIR |= 0x0A; //P3.1(SIMO)& P3.3(UCLK)
//UCTL0 &=~SWRST; //endding USART0_init
IE1 &=~ URXIE0; //IE1 |= URXIE0; //接收中断允许
UCTL0 &=~ SWRST;
}
/*--------------------读数据指令---------------------------*/
void r_cmd(uchar add,uchar d_long)
{
uchar ii;
P2OUT &=~ BIT0;
TXBUF0=0x03; //0x03;
while (!(UTCTL0 & TXEPT));
TXBUF0=add;
while (!(UTCTL0 & TXEPT));
for (ii=0;ii
TXBUF0=0;
while (!(UTCTL0 & TXEPT));//判断发送数据完成
//while (!(IFG1 & URXIFG0));//判断接收数据到位
Data[ii]=RXBUF0;
}
P2OUT |= BIT0;
}
/*--------------------写数据指令---------------------------*/
void w_cmd(uchar add,uchar data,uchar d_long)
{
uchar ii;
P2OUT &=~ BIT0;
TXBUF0=0x02;
while (!(UTCTL0 & TXEPT));
TXBUF0=add;
while (!(UTCTL0 & TXEPT));
for (ii=0;ii
TXBUF0=data;
while (!(UTCTL0 & TXEPT));
}
P2OUT |= BIT0;
}
/*--------------------开始发送指令-------------------------*/
void t_cmd(void)
{
P2OUT &=~ BIT0;
TXBUF0 = 0x81;
while (!(UTCTL0 & TXEPT));
P2OUT = BIT0;
}
//---------------------------//////
void init_CAN(void);
/*-----------------------MAIN-----------------------------*/
void main(void)
{
init_spi();
_EINT();
P2SEL = 0x00;
P2DIR = 0x01;
P2OUT = 0xFF;
init_CAN();
w_cmd(0x31,0xaa,13);
w_cmd(0x35,0x08,1);
t_cmd();
while(1)
{
r_cmd(0x60,0x0f);
//r_cmd(0x00);
}
while(1);
}
/*------------------CAN初始化---------------------*/
void init_CAN(void)
{
w_cmd(0x0f,0x80,0x01); //80配置模式
//发送------------
w_cmd(0x2a,0x00,0x01); //CNF1
w_cmd(0x29,0xf1,0x01); //CNF2 位时序
w_cmd(0x28,0x05,0x01); //CNF3
w_cmd(0x0d,0x07,0x01); //芯片发送引脚使能设置
//接受------------
w_cmd(0x60,0x60,0x01); //0x60关闭屏蔽和滤波,接受所有报文,0x00正常屏蔽滤波
w_cmd(0x0c,0x00,0x01); //接收引脚控制使能
w_cmd(0x2b,0x00,0x01); //中断使能
w_cmd(0x2c,0x00,0x01); //中断标志
w_cmd(0x0f,0x40,0x01); //0正常模式,80配置,40环回
}
---------------------------------------------------------------------------------------------
这个是调试通过了的SPI & CAN2510全部完整程序了,初始化430的SPI、2510,读指令、写指令、发送指令(读、写都可以一次发送N 条,因为2510有连续操作的能力)
/*--------------------写数据指令---------------------------*/
void w_cmd(uchar add,uchar data,uchar d_long)
变量 d_long 就是长度(读指令相同)
我用了光藕的,不用光藕直接连接应该没问题,2510的工作电压可以到5V ,所以可以直接用。 答 10: 忘了说,我都没用中断进行传送控制,电路设计的是用P2。3吧,拿来做2510的缓冲满中断。
这个程序应该很好的实现了430通过SPI 口对2510的指令数据传送了,具体到实际应用,只需要修改程序结构和按实际网络传输比特率来对MCP2510初始化就可以了。我的项目因采购这不是放假嘛,没给我买到DC-DC,所以PCB没元件封装出不来,只有一块板子做实验,没办法望下编程进行连机调试,所以就实验到了这里。
SPI 设定1M ,2510的位时序应该是125K 吧。过个节都快忘光了。呵呵呵呵
希望对你有帮助,对大家都有帮助吧!! 答 11: 很好!多谢。 答 12: 应该置顶,版主无私的奉献 答 13: 有需要2510中文手册的可以在此留话,我好象记得有人要过。 答 14: 大侠真是一个热心肠的人!
呵呵,本人想求大虾一份2510的中文资料,求大虾帮忙!不胜感谢!
我的信箱:lzqbb163.com
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
5月直播——【探索边缘智能的未来——直播盛宴即将开启!】 | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
【有奖活动】智能可穿戴设备AR/VR如何引领科技新潮流! | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 |