单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:2700|回复:0
打印上一主题下一主题

2440驱动MMA7455L源程序

[复制链接]
跳转到指定楼层
楼主
ID:768308发表于 2020-6-5 12:23|只看该作者|只看大图回帖奖励


单片机源程序如下:
  1. /****************************************************************
  2. 文件名:Main.c
  3. 功能描述:主程序
  4. ****************************************************************/
  5. #define     GLOBAL_CLK         1

  6. #include< stdlib.h>
  7. #include< string.h>
  8. #include "def.h"
  9. #include "option.h"
  10. #include "2440addr.h"
  11. #include "2440lib.h"
  12. #include "2440slib.h"
  13. #include "Uart.h"
  14. void SPI_Init(void);
  15. void WriteByte_MMA7455L(U8 addr,U8 dat);
  16. U8 ReadByte_MMA7455L(U8 addr);                        
  17. static U32 cpu_freq;    
  18. static U32 UPLL;        
  19. static void cal_cpu_bus_clk(void)
  20. {
  21.      U32 val;
  22.      U8 m, p, s;    
  23.      val = rMPLLCON;       //MPLLCON上电初始值为0x00096030
  24.      m = (val>>12)&0xff;     //结果为0x96=150
  25.      p = (val>>4)&0x3f;     //结果为0x03=3
  26.      s = val&3;               //结果为0
  27.      //(m+8)*FIN*2 不要超出32位数!
  28.      FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;//"1<<s"表示令1左移s位,即可得2^s    
  29.      val = rCLKDIVN;
  30.      m = (val>>1)&3;
  31.      p = val&1;    
  32.      val = rCAMDIVN;
  33.      s = val>>8;    
  34.      switch (m) {
  35.      case 0:
  36.          HCLK = FCLK;
  37.          break;
  38.      case 1:
  39.          HCLK = FCLK>>1;
  40.          break;
  41.      case 2:
  42.          if(s&2)
  43.              HCLK = FCLK>>3;
  44.          else
  45.              HCLK = FCLK>>2;
  46.          break;
  47.      case 3:
  48.          if(s&1)
  49.              HCLK = FCLK/6;
  50.          else
  51.              HCLK = FCLK/3;
  52.          break;
  53.      }    
  54.      if(p)
  55.          PCLK = HCLK>>1;
  56.      else
  57.          PCLK = HCLK;    
  58.      if(s&0x10)
  59.          cpu_freq = HCLK;
  60.      else
  61.          cpu_freq = FCLK;        
  62.      val = rUPLLCON;
  63.      m = (val>>12)&0xff;
  64.      p = (val>>4)&0x3f;
  65.      s = val&3;
  66.      UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
  67.      UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
  68. }

  69. void Main(void)
  70. {
  71.      U8 key,sta;            
  72.      int i;                
  73.      U32 mpll_val = 0;
  74.      i = 2 ;    
  75.      switch ( i ) {
  76.      case 0:     //200
  77.          key = 12;
  78.          mpll_val = (92<<12)|(4<<4)|(1);
  79.          break;
  80.      case 1:     //300
  81.          key = 13;
  82.          mpll_val = (67<<12)|(1<<4)|(1);
  83.          break;
  84.      case 2:     //400M
  85.          key = 14;
  86.          mpll_val = (92<<12)|(1<<4)|(1);
  87.          break;
  88.      case 3:     //440!!!
  89.          key = 14;
  90.          mpll_val = (102<<12)|(1<<4)|(1);
  91.          break;
  92.      default:
  93.          key = 14;
  94.          mpll_val = (92<<12)|(1<<4)|(1);
  95.          break;
  96.      }
  97.      //rMPLLCON赋值0x5c011
  98.      ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
  99.      ChangeClockDivider(key, 12); //key=14
  100.      cal_cpu_bus_clk();
  101.     
  102.      Port_Init();     //IO端口初始化
  103.      SPI_Init();//SPI初始化
  104.      MMA7455L_INIT();//MMA7455L初始化
  105.      Uart_Init();//串口初始化
  106.      Uart_Select(0);
  107.      Delay(5); //延时10ms让IIC和SPI准备就绪
  108.      Uart_Printf("CLKCON=%x!",rCLKCON);
  109.      Uart_Printf("开始发送数据!\n\n");    
  110.      //对MMA7455L的0x16寄存器写配置数据0x05
  111.      WriteByte_MMA7455L(0x16,0x05);
  112.      //读回0x16寄存器的配置值,判断SPI通信是否成功.
  113.      sta=ReadByte_MMA7455L(0x16);  
  114.      Uart_Printf("sta=0x%x",sta);
  115.      while(1)
  116.      {

  117.      }
  118. }

  119. void WriteByte_MMA7455L(U8 addr,U8 dat)
  120. {
  121.      int n;
  122.      //片选CS置低,使能MMA7455为SPI模式
  123.      rGPFDAT& = 0xef;  
  124.      Delay(1);
  125.     
  126.      Uart_Printf("SPI状态寄存器的数据为0x%x!\n",rSPSTA0);
  127.      while(!(rSPSTA0&0x01==0x01)) ;
  128.      //高位置1写操作
  129.      rSPTDAT0 = 0x80|((addr& 0x3f)<<1);  
  130.      Uart_Printf("SPI状态寄存器的数据为0x%x!\n",rSPSTA0);
  131.      Uart_Printf("写操作地址发送成功!\n");    
  132.      for(n=0;n<20;n++);    
  133.      Uart_Printf("SPI状态寄存器的数据为0x%x!\n",rSPSTA0);
  134.      while(!(rSPSTA0&0x01==0x01)) ;
  135.      rSPTDAT0 = dat;  //写数据
  136.      Uart_Printf("SPI状态寄存器的数据为0x%x!\n",rSPSTA0);
  137.      Uart_Printf("写操作数据发送成功!\n");    
  138.      for(n=0;n<20;n++);    
  139.      //片选CS置高电平,结束SPI通信
  140.      rGPFDAT |= 0xff;  
  141.      Delay(1);
  142. }

  143. U8 ReadByte_MMA7455L(U8 addr)
  144. {
  145.      int n;
  146.      U8 Re_Dat;
  147.      //片选CS置低电平,使能MMA7455L为SPI模式
  148.      rGPFDAT& = 0xef;  
  149.      Delay(1);    
  150.      Uart_Printf("SPI状态寄存器的数据为0x%x!\n",rSPSTA0);
  151.      while(!(rSPSTA0&0x01==0x01)) ;
  152.      //读操作高位清0
  153.      rSPTDAT0 = (addr& 0x3f)<<1;  
  154.      Uart_Printf("SPI状态寄存器的数据为0x%x!\n",rSPSTA0);
  155.      Uart_Printf("读操作地址发送成功!\n");    
  156.      for(n=0;n<20;n++);    
  157.      Uart_Printf("SPI状态寄存器的数据为0x%x!\n",rSPSTA0);
  158.      while(!(rSPSTA0&0x01==0x01));
  159.      Re_Dat = rSPRDAT0;
  160.      Uart_Printf("SPI状态寄存器的数据为0x%x!\n",rSPSTA0);    
  161.      for(n=0;n<20;n++);
  162.      //片选CS置高电平,结束SPI通信
  163.      rGPFDAT |= 0xff;
  164.      Delay(1);
  165.        //返回读取数据
  166.      return Re_Dat;
  167. }
  168. //MMA7455L初始化
  169. void MMA7455L_INIT(void )
  170. {
  171.    MMA_QUEUE.MMA_HEAD=0;
  172.    MMA_QUEUE.MMA_CUR=0;  
  173.    SPI_WriteREG(0x16,0x05);//级别模式
  174.    delay_nus(10);
  175.    SPI_WriteREG(0x18,0x20);
  176.    delay_nus(10);
  177.    SPI_WriteREG(0x19,0x00);
  178.    delay_nus(10);
  179.    SPI_WriteREG(0x1a,0x00);
  180.    delay_nus(10);
  181.   }
  182. //SPI初始化
  183. void SPI_Init(void)
  184. {    
  185.      //激活时钟控制器的SPI位
  186.      rCLKCON |= 1<< 18;
  187.      rSPCON0 = (0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(0<<1)|1;
  188.      //查询模式;SCK使能;主机模式;时钟低电平有效;格式A;普通模式;
  189.      //MMA7455的SPI的传输波特率在工作电压小于2.4V时最高可达4MHz,大于2.4V时可达8MHz
  190.      //SPI波特率为50MHz/2/(24+1)=1MHz
  191.      rSPPRE0 = 24;      
  192. }
复制代码

所有资料51hei提供下载:
第4章.zip(13.24 KB, 下载次数: 6)


评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网