这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 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<d_long ;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<d_long ;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 跳转至

回复

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