这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 综合技术» 基础知识» MCP2510,MSP430F449,SPI,CAN 大家帮看看MCP2510与

共1条 1/1 1 跳转至

MCP2510,MSP430F449,SPI,CAN 大家帮看看MCP2510与F449-SPI接口的CAN回环模式实现程序

菜鸟
2010-08-09 18:06:53 打赏

哪位大侠帮帮忙,从430F449发送数据到mcp2510可以,但是读回来的数据总是0,就不知道为何了,用过2510的哥哥姐姐们帮忙给看一下程序!!!
#include "msp430x44x.h"
#include "mcp2510.h"
#define CS_H (P4OUT |= BIT2)
#define CS_L (P4OUT &= ~BIT2)

//变量设置
unsigned char send_buff[256];
unsigned char data_buff[256];
unsigned char temp;
/************************************************************************/
//延时
/************************************************************************/
void Delay(unsigned int dly)
{
while(dly --);
}
/************************************************************************/
//时钟初始化部分
/************************************************************************/
void init_CLK()
{
FLL_CTL0 |= DCOPLUS; //内部电阻使能
//打开XT2,清除XT2失效标志
FLL_CTL1 &= ~XT2OFF;//打开XT2
FLL_CTL0 &= ~XT2OF;//清除XT2故障标志
while(FLL_CTL0&XT2OF);
////清除DCO失效标志
FLL_CTL0 &= ~BIT0; //清除,DCO没有实效
while(FLL_CTL0&BIT0);
FLL_CTL1 |= SELS + SELM_XT2; //MCLK=XT2,SMCLK=XT2
}
/************************************************************************/
//初始SPI
/************************************************************************/
void init_SPI(void)
{
P4SEL = BIT3 + BIT5 + BIT4; //P4.3=SIMO1,P4.5=UCLK1,P4.4=SOMI1
P4DIR = BIT2 + BIT3 + BIT5; //CS SIMO1 UCLK1 is OUTPUT

P1SEL |= BIT1 + BIT4 + BIT5; // SMCLK MCLK ACLK OUTPUT
P1DIR |= BIT1 + BIT4 + BIT5;//定义为输出

U1CTL = SWRST; //控制位SWRST置位,进行串口设置
U1CTL |= CHAR + SYNC + MM; //八位 同步SPI通信 主机模式
U1TCTL |= CKPL + CKPH + SSEL1; //时钟极性 选择时钟源SMCLK 1.1模式

//波特率设置UCLK=8M/8=1M
U1BR0 = 0x08; //低8位分频: 8
U1BR1 = 0x00; //高8位分频: 0
U1MCTL = 0x00; //没有调整: 0
ME2 |= USPIE1; //使能SPI接收发送

U1CTL &= ~SWRST; //控制位清零
//IE2 = URXIE1 | UTXIE1; //接收中断和发送中断允许
}
/*#pragma vector=USART1RX_VECTOR //中断,接收回环模式数据
__interrupt void UART0_RX_ISR()
{
;
}
#pragma vector=USART1TX_VECTOR //中断,将send_buff[256]中数据传送出去
__interrupt void UART0_TX_ISR()
{
}*/
/************************************************************************/
//SPI指令程序
/************************************************************************/
//写指令
void w_cmd(unsigned char addr,unsigned char data,unsigned char d_long)
{//写入data数据d_long次 用UTCTL1发送控制寄存器中的发送器空标志位(TXEPT)进行鉴定
unsigned char ii;
CS_L;
TXBUF1 = 0x02; //写指令
UTCTL1 &= ~TXEPT;
while(!(UTCTL1 & TXEPT));
TXBUF1 = addr;
UTCTL1 &= ~TXEPT;
while (!(UTCTL1 & TXEPT));
for (ii=0; ii{
TXBUF1 = data;
UTCTL1 &= ~TXEPT;
while(!(UTCTL1 & TXEPT));
}
CS_H;
}
//读指令
void r_cmd(unsigned char addr,unsigned char d_long)
{
unsigned char ii;
CS_L;
TXBUF1 = 0x03; //读指令
UTCTL1 &= ~TXEPT;
while(!(UTCTL1 & TXEPT));

TXBUF1 = addr;
UTCTL1 &= ~TXEPT;
while (!(UTCTL1 & TXEPT));

for (ii=0; ii{
TXBUF1 = 0;
UTCTL1 &= ~TXEPT;
while (!(UTCTL1 & TXEPT));//判断发送数据完成

data_buff[ii] = RXBUF1;
}
CS_H;
}
//请求发送指令
void t_cmd(void)
{
CS_L;
TXBUF1 = 0x81;//TXB0请求发送
UTCTL1 &= ~TXEPT;
while(!(UTCTL1 & TXEPT));
//Delay(1000);
CS_H;
}
//读状态指令
unsigned char r_stats(void)
{
CS_L;
TXBUF1 = 0x0a0;//读状态指令
UTCTL1 &= ~TXEPT;
while(!(UTCTL1 & TXEPT));
TXBUF1 = 0x00;//随便一个数
UTCTL1 &= ~TXEPT;
while(!(UTCTL1 & TXEPT));
temp = (RXBUF1&0x01);
CS_H;

return(temp);
}
/************************************************************************/
//初始CAN
/************************************************************************/
void init_CAN(void)
{
w_cmd(0x0f,0x80,0x01); //CAN控制寄存器(0x0f):0x80配置模式
//发送
w_cmd(0x2a,0x00,0x01); //CNF1 位定时配置寄存器
w_cmd(0x29,0xf1,0x01); //CNF2 位时序 相位2段由CNF3确定 采样点进行三次采样 相位1段长度为8TQ
w_cmd(0x28,0x05,0x01); //CNF3 相位2段长度(5+1)×TQ=6TQ

w_cmd(0x0d,0x07,0x01); //TXRTSCTRL(TXnRTS引脚控制和状态寄存器):芯片发送引脚使能设置 (引脚状态为请求发送输入 --)

//接收
w_cmd(0x60,0x60,0x01); //0x60关闭屏蔽和滤波,接受所有报文,0x00正常屏蔽滤波
w_cmd(0x0c,0x00,0x01); //接收引脚控制使能

w_cmd(0x2b,0x01,0x01); //CANINTE中断使能禁止(除接收满中断)
w_cmd(0x2c,0x00,0x01); //CANINTF中断标志没有
w_cmd(0x0f,0x40,0x01); //0正常模式,80配置,40环回

}
/************************************************************************/
//main程序
/************************************************************************/
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;

//unsigned char tmp;

init_CLK();
init_SPI(); _EINT();
init_CAN();

w_cmd(0x31,0xaa,13);
w_cmd(0x34,0x08,1);
t_cmd();

while(!((r_stats())&0x01));

r_cmd(0x60,255);
LPM0;
}





关键词: MCP2510 MSP430F449 大家 看看

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]