找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2576|回复: 0
打印 上一主题 下一主题
收起左侧

2440驱动MMA7455L源程序

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  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)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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