打印

为什么采用模拟SPI控制MCPS6S28芯片的方法不能进行通道转换

[复制链接]
1434|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LBY2037|  楼主 | 2008-3-5 13:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位朋友:

   我模拟SPI控制MCPS6S28芯片的方法不能进行通道转换,MCPS6S28芯片总是处在默认的0通道1增益的模式下,请帮我看看我的这段程序是否有问题,延时时间基本遵循MCPS6S28芯片的spi时序说明,谢谢各位!


/* ****************************************************************
** 函 数 名: MCP6S28_SPI()
** 功能描述: MCU通过模拟SPI,对MCP6S28进行通道,增益控制
******************************************************************/

void  MCP6S28_SPI(void)
{
    unsigned char i = 0;
            
    mcp6s28_order = 0b01000001; //每次更换通道时都要发送一次通道                                   //寄存器(通道数值)//通道命令字
            
         mcp6s28_interim_data = 1;//写入通道的数值  1通道
                                        //RC2 = 1;//片选    -CS                    //RB4 = 1;//时钟  SCK    
            //RB5             SI单片机发送端口
        RB4 = 0;//时钟    //sck初始状态为低电平  
        Nop();    //>=10ns    
        Nop();        
        Nop();
        Nop();
                                                    
        RC2 = 1;//片选    >=40ns
        Nop();    //>=40ns    
        Nop();        
        Nop();                     
        RC2 = 0;//片选-CS清成低电平 启动6s28器件的通讯 
        Nop();//延时一段时间    
        Nop();//延时一段时间                
               for( i = 0; i < 8 ; i ++ )//连续发送命令字  
                                         //(mcp6s28_order)的8个位数据
             {    //先发指令字的高位然后发指令字底位,再发通道寄存器          //的高位,最后发通道)寄存器的低位                                         
        if(( (mcp6s28_order << i ) & 0x80 ) == 0x80 ) //将
                                              //mcp6s28_order向左边移                                            //动0位,1位.....8位,由                                            //于i 的控制就可以先发                                            //送高位后发送地位,
        {                           //该位等于1                      RB5 = 1;  //将要发送的数据位放到 R5 上,并连接
                       //到mcp6s28的SI口,进入mcp6s28芯片        }
                  else           //表明该位等于0                {             
             RB5 = 0; //将要发送的数据位放到 RB5 上,并连接
                 //到mcp6s28的SI口,进入芯片            }    
        Nop();       //>=40ns 延时一段时间    
        Nop();       //延时一段时间    
        Nop();       //延时一段时间    
        Nop();       //延时一段时间    
        
                  RB4 = 1;     //sck置成高电平 1   
        Nop();       //>=40ns   //延时一段时间    
        Nop();      //延时一段时间    
        Nop();      //延时一段时间    
        Nop();       //延时一段时间                                           
                    
        RB4 = 0;  //sc清为低电平   0   

         }
         for( i = 0; i < 8 ; i ++ ) //连续发送通道寄存器的8个位
         {                          //数据(mcp6s28_interim_data    
      if(( (mcp6s28_interim_data << i ) & 0x80)  == 0x80 ) //将 
                //mcp6s28_interim_data向左边移动0
                                    //位,1位.....8位,由于i 的控制就可                                  //以先发送高位后发送地位,    
                     

    {                         //该位等于1
                                 RB5 = 1;     //将要发送的数据位放到 RB5 上,并连接到mcp6s28
             //的SI口,进入芯片            
    }                    else                              // 表明该位等于0
                        {                                                  RB5 = 0;     //将要发送的数据位放到 RB5 上,并连接到
                              //mcp6s28的SI口,进入芯片
    }     
    Nop();  //>=40ns                              //延时一段时间    
    Nop(); //延时一段时间    
    Nop(); //延时一段时间    
    Nop(); //延时一段时间    
                                  RB4 = 1;      //sck置成高电平 1 
         
         Nop();     //>=40ns  //延时一段时间    
    Nop();               //延时一段时间        
    Nop();               //延时一段时间
    Nop();               //延时一段时间                         
                    
    RB4 = 0;         //sc清为低电平     

         Nop();     //>=30ns                               //延时一段时间    
         Nop();//延时一段时间        
         Nop();//延时一段时间            
         Nop();//延时一段时间    
         RC2 = 1;//在2个字节都发送完后将CS清成高电平,本次(命令,数据)发送完    
        Nop(); //>=100ns //延时一段时间    
        Nop(); //延时一段时间        
        Nop();//延时一段时间            
        Nop();//延时一段时间        
        Nop();//延时一段时间        

    } 

void main (void)
{
    port_initia( );//所有端口进行初始化          
    while (1)               
    {  
       MCP6S28_SPI(  );                        //发送通道控制                         
     }
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

9

帖子

0

粉丝