MSP430与mcp2515的can通讯程序1

2019-07-20 16:26发布

本帖最后由 NYT369 于 2016-5-21 12:31 编辑

用msp430afe253制作了电路板,程序已经在电路板上运行正常
程序示例:#include "CAN.h"#include "msp430_config.h"#include "mcp2515.h"
#define uchar unsigned char#define uint unsigned int
uchar flag;INT16U NUM_COUNT = 0;INT8U  Time_Flag = 0;#define CAN_RST_0      P1OUT &=~BIT1   //#define CAN_RST_1      P1OUT |= BIT1    //
uchar Address;                      //地址uchar RecvBuff[8]={0};              //接收缓存区     uchar SendBuff[8]={0}, SendIndex=0; //发送缓存区,接发送数据缓存区对应数

uchar can_isr_flag = 0;         //P1.2有CAN中断标志:接收、发送、错误、溢出uchar can_rcv_data_flag = 0;    //CAN接收数据标志uchar datapro_write_flag=0;//处理接收的数据正确,置位发送uchar times;                   //计数次数uchar SYSTime;

/////////////////////////////////////////////////////////////////////////////////////////////void delay(uint x){  uchar i;  while(x--) for(i=120;i>0;i--);}///////////////////////////////////////////////////////////void Init_Clk(){  uchar i;  BCSCTL1&=~XT2OFF;             //打开XT2振荡器 //基础时钟控制寄存器BCSCTL1的第7位置0,使XT2启动  do  {    IFG1 &= ~OFIFG;               // 清除振荡器失效标志    for (i = 0xFF; i > 0; i--);   // 延时,等待XT2起振  }  while ((IFG1 & OFIFG) != 0);     // 判断XT2是否起振  BCSCTL2 =SELM_2+SELS+DIVS_0;    //选择MCLK为XT2  SMCLK为XT2 不分频}/////////////////////////////////////////////////////////void Init_TimeA(){   TACCTL0 = CCIE;               //TBCCR0允许中断   TACCR0 = 8000;                //TIME:8000/(8mhz) =1ms                       TACTL = TASSEL_2 + MC_1;     //SMCLK,增计数模式   _BIS_SR( GIE);    }
///////////////////////////////////////////////////////////void set_p12_to_int( void ){
P1DIR&=~BIT2; // 中断引脚应该设置为输入 P1IES|=BIT2;  //设置为下降沿触发,=0上升触发 P1IFG&=~BIT2; //因为P2IES设置会使中断标志位置位,故清零 P1IE|=BIT2;   //设置中断使能}//////////////////////////////////////////////void init_SD24(){  uint i;  SD24CTL = SD24SSEL_1+SD24REFON+SD24DIV_3;                       // 1.2V ref, SMCLK,SMLCK 8分频  SD24INCTL0 = SD24INCH_0+SD24GAIN_16;                            // Set channel A0+/- 16倍增益   SD24CCTL0 |= SD24SNGL  + SD24IE+SD24OSR_512+SD24DF;             // Single conv,enable interrupt  采样率为512  数据格式(当增益为1时0-32768表示0~-600mv  65535~32768表示0~600mv)   for (i = 0; i < 0x3600; i++);                                   // Delay for 1.2V ref startup
}/////////////////////////////////////////////////////////////////////由于发帖字数限制,该帖子未完,请关注续贴。技术交流:qq:531706356,13106551527
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
1988020566
1楼-- · 2019-07-21 12:37
一般都是用的485的通信
20153177
2楼-- · 2019-07-21 14:36
请问如何将以下的程序改为
在G2板上利用p1.6(PWM输出口)驱动LED来实现呼吸灯。呼吸灯就是亮度渐变的LED灯,普通LED可以用TA输出PWM来控制亮度,通过WDT定时中断来改变亮度,从而实现呼吸灯效果。
1、通过按键来控制呼吸灯的呼吸频率,即亮度渐变的快慢。
控制方式:按扩展板上KEY1键,呼吸加快一档,连续按2下,呼吸加快一档,连续按3下,呼吸又加快一档......;按KEY3键,呼吸减慢一档,连续按2下,呼吸减慢一档,连续按3下,呼吸又减慢一档......。
2、在液晶屏上显示呼吸灯呼吸频率的相关信息
#include<msp430g2553.h>
void BreathLED()
{
        
         P1SEL =BIT6;
         P1DIR = BIT6;
         P1OUT=0;
         TACTL = TASSEL_1 + MC_1  ;
         TACCTL1 =  OUTMOD_3 ;
         TACCTL0 = CCIE;
         CCR0 =12000;
         CCR1 =327;         //0% pwm
         
         TACTL |=TACLR;
         _EINT();
}
         
int main( void )
{
   // Stop watchdog timer to prevent time out reset
   WDTCTL = WDTPW + WDTHOLD;
   BCSCTL3 |= LFXT1S_2; // Set LFXT1为vol时钟即12kHZ
   BreathLED();
   LPM0;
   return 0;
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void CountTimes()
{
         static int Times;
         Times++;
         switch(Times)
         {
         case 20:
                 CCR1=294;
                 break;
         case 30:
                 CCR1=277;
                 break;
         case 40:
                 CCR1=262;   //20% PWM
                 break;
         case 50:
                 CCR1=245;   //20% PWM
                 break;
         case 60:
                 CCR1=228;   //40% PWM
                 break;               
         case 80:
                 CCR1=196;   //40% PWM
                 break;
         case 100:
                 CCR1=163;
                 break;
         case 120:
                 CCR1=131;   //60% PWM
                 break;
         case 140:
                 CCR1=98;   //60% PWM
                 break;
         case 160:
                 CCR1=65;    //80% PWM
                 break;
         case 180:
                 CCR1=32;    //80% PWM
                 break;               
         case 200:
                 CCR1=1;     //100% PWM
                 break;
         case 220:
                 CCR1=32;    //80% PWM
                 break;
         case 240:
                 CCR1=65;
                 break;
         case 260:
                 CCR1=98;   //60% PWM
                 break;
         case 280:
                 CCR1=131;
                 break;
         case 300:
                 CCR1=163;
                 break;
         case 320:
                 CCR1=196;
                 break;
20153177
3楼-- · 2019-07-21 16:45
 精彩回答 2  元偷偷看……
vivilzb1985
4楼-- · 2019-07-21 19:45
can通讯还是蛮复杂的。
NYT369
5楼-- · 2019-07-21 21:34
 精彩回答 2  元偷偷看……

一周热门 更多>