发 帖  
[问答] LTC2641与MCP3302的模拟单电池电路
2018-1-29 13:17:57  707 模拟 电池 电路
收藏 0 收藏 推荐 0 推荐
分享
最近在做一个实验:
使用S12xdt256作为主控,有片内资源SPI0同时与LTC2641和MCP3302通讯发现,3302的工作状态受到2641的影响,但是用观察示波器观察发现输入并没什么问题,部分原理图代码如下,望各位大佬帮我看看分析一下。
  1. <img src="http://bbs.elecfans.com/forum.php?mod=image&aid=576910&size=300x300&key=7852e19d7fa379c5&nocache=yes&type=fixnone" aid="attachimg_576910" alt="" width="326" height="271" border="0">
复制代码
  1. SPI0初始化:
  2. static void InitSPI0(void)
  3. {

  4.     SPI0CR1_SPE = 1;                    /* SPI使能 */
  5.     SPI0CR1_MSTR = 1;       /*设置单片机为主机模式 */
  6.     SPI0CR1_CPHA = 0;
  7.     SPI0CR1_CPOL = 0;       /* 四种组合 */
  8.     SPI0CR1_LSBFE = 0;                  /* 数据传输时高位在前 */
  9.    
  10.     SPI0CR1_SSOE = 1;
  11.    
  12.    // SPI0BR = 0x43;          /* SPI的波特率为500k    40MHz bus clock  40000/(4+1)*2^(3+1)k */
  13.     SPI0BR = 0x42;          /* SPI的波特率为500k    20MHz bus clock  20000/(4+1)*2^(2+1)k */

  14. }
复制代码
  1. INT16U SPI0_Sample(INT8U spi_ch)
  2. {
  3.   
  4.   INT8U ch,chs;                  /*chs为MCP3208 ch0-ch3(0x06)和ch4-ch7(0x07) 段值*/
  5.   INT16U result;
  6.   INT8U c,i,data[2];                                                /* 定义无符号字符变量 c */
  7.    
  8.   switch(spi_ch){
  9.    
  10.     case 0:
  11.     ch = 0x00;
  12.     chs = 0x0C;
  13.     break;
  14.    
  15.     case 1:
  16.     ch = 0x80;
  17.     chs = 0x0C;
  18.     break;
  19.    
  20.     case 2:
  21.     ch = 0x00;
  22.     chs = 0x0D;
  23.     break;
  24.    
  25.     case 3:
  26.     ch = 0x80;
  27.     chs = 0x0D;
  28.     break;
  29.    

  30.     default:
  31.     return 0;
  32.   }
  33.    
  34.   ////////////////////////////////////
  35.   for(i=1;i<15;i++)
  36.   {
  37.       Ctl3302_1 =1;
  38.   }
  39.   ///////////////////////////////////////
  40.   
  41.   for(i=1;i<30;i++)/* 数据传输前片选信号为低并保持一段时间 */
  42.   {
  43.       Ctl3302_1 = 0;
  44.   }
  45.   
  46.   while(SPI0SR_SPTEF==0){;}                 /* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器 */
  47.     c = SPI0SR;                                                                  
  48.     SPI0DR = chs;
  49.   
  50.   while(SPI0SR_SPIF==0){;}
  51.     c=SPI0DR;                  /* SPI接受第一个字节,内容不care */
  52.   
  53.   while(SPI0SR_SPTEF==0){;}                 /* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器 */
  54.     c=SPI0SR;                                                                  
  55.     SPI0DR=ch;
  56.   
  57.   while(SPI0SR_SPIF==0){;}
  58.     data[0]=SPI0DR;            /* SPI接受 */
  59.    
  60.   while(SPI0SR_SPTEF==0){;}                 /* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器 */
  61.     c=SPI0SR;                                                                  
  62.     SPI0DR=0x00;                                          

  63.   while(SPI0SR_SPIF==0){;}
  64.     data[1]=SPI0DR;            /* SPI接受 */
  65.    
  66.   for(i=1;i<70;i++)                                           /* 数据传输后片选信号先为低后为高,并保持一段时间 */
  67.   {
  68.       Ctl3302_1 = 0;                                                  
  69.   }
  70.   for(i=1;i<15;i++)
  71.   {
  72.       Ctl3302_1 = 1;
  73.   }
  74.   
  75.   result = data[0]&0x0f;
  76.   result = result<<8;
  77.   result = result+data[1];
  78.   return result;
  79.    

  80. }
复制代码
  1. void INTLTC2641_1(void)
  2. {
  3.     INT8U i,c;                                       
  4.     INT16U pData = 0;

  5.    
  6.     pData = 0x9999;

  7.     for(i=1;i<20;i++)   /* 数据传输前片选信号为低并保持一段时间 */
  8.     {
  9.         SPI0EN = 1;
  10.     }
  11.     ///////////////////////////////////////
  12.     for(i=1;i<20;i++)   /* 数据传输前片选信号为低并保持一段时间 */
  13.     {
  14.         SPI0EN = 0;
  15.         
  16.     }
  17.    

  18.    /////////////  写入 LTC2641-1  ////////////
  19.     while(SPI0SR_SPTEF==0){;}                 /* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器 */                                                  
  20.       //SPI0DR =  (INT8U)(pData&0xff);
  21.         c = SPI0SR;
  22.         SPI0DR = (INT8U)(pData >> 8)&0xff;
  23.         
  24.     while(SPI0SR_SPTEF==0){;}                 /* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器 */                                                  
  25.       //SPI0DR = (INT8U)(pData >> 8)&0xff;
  26.         c = SPI0SR;
  27.         SPI0DR =  (INT8U)(pData&0xff);
  28.    
  29.     for(i=1;i<100;i++)
  30.     {
  31.         SPI0EN = 0;
  32.         
  33.     }
  34.     for(i=1;i<50;i++)
  35.     {
  36.         SPI0EN = 1;
  37.         
  38.     }
  39.    
  40.    
  41. }
复制代码


1.JPG
2018-1-29 13:17:57   评论 邀请回答

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

提问题
关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表