51hei.png (23.9 KB, 下載次數: 115)
下載附件
2020-6-5 17:32 上傳
單片機源程序如下:
- /****************************************************************
- 文件名:Main.c
- 功能描述:主程序
- ****************************************************************/
- #define GLOBAL_CLK 1
- #include <stdlib.h>
- #include <string.h>
- #include "def.h"
- #include "option.h"
- #include "2440addr.h"
- #include "2440lib.h"
- #include "2440slib.h"
- #include "Uart.h"
- void SPI_Init(void);
- void WriteByte_MMA7455L(U8 addr,U8 dat);
- U8 ReadByte_MMA7455L(U8 addr);
- static U32 cpu_freq;
- static U32 UPLL;
- static void cal_cpu_bus_clk(void)
- {
- U32 val;
- U8 m, p, s;
- val = rMPLLCON; //MPLLCON上電初始值為0x00096030
- m = (val>>12)&0xff; //結果為0x96=150
- p = (val>>4)&0x3f; //結果為0x03=3
- s = val&3; //結果為0
- //(m+8)*FIN*2 不要超出32位數!
- FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;//"1<<s"表示令1左移s位,即可得2^s
- val = rCLKDIVN;
- m = (val>>1)&3;
- p = val&1;
- val = rCAMDIVN;
- s = val>>8;
- switch (m) {
- case 0:
- HCLK = FCLK;
- break;
- case 1:
- HCLK = FCLK>>1;
- break;
- case 2:
- if(s&2)
- HCLK = FCLK>>3;
- else
- HCLK = FCLK>>2;
- break;
- case 3:
- if(s&1)
- HCLK = FCLK/6;
- else
- HCLK = FCLK/3;
- break;
- }
- if(p)
- PCLK = HCLK>>1;
- else
- PCLK = HCLK;
- if(s&0x10)
- cpu_freq = HCLK;
- else
- cpu_freq = FCLK;
- val = rUPLLCON;
- m = (val>>12)&0xff;
- p = (val>>4)&0x3f;
- s = val&3;
- UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
- UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
- }
- void Main(void)
- {
- U8 key,sta;
- int i;
- U32 mpll_val = 0;
- i = 2 ;
- switch ( i ) {
- case 0: //200
- key = 12;
- mpll_val = (92<<12)|(4<<4)|(1);
- break;
- case 1: //300
- key = 13;
- mpll_val = (67<<12)|(1<<4)|(1);
- break;
- case 2: //400M
- key = 14;
- mpll_val = (92<<12)|(1<<4)|(1);
- break;
- case 3: //440!!!
- key = 14;
- mpll_val = (102<<12)|(1<<4)|(1);
- break;
- default:
- key = 14;
- mpll_val = (92<<12)|(1<<4)|(1);
- break;
- }
- //rMPLLCON賦值0x5c011
- ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
- ChangeClockDivider(key, 12); //key=14
- cal_cpu_bus_clk();
-
- Port_Init(); //IO端口初始化
- SPI_Init();//SPI初始化
- MMA7455L_INIT();//MMA7455L初始化
- Uart_Init();//串口初始化
- Uart_Select(0);
- Delay(5); //延時10ms讓IIC和SPI準備就緒
- Uart_Printf("CLKCON=%x!",rCLKCON);
- Uart_Printf("開始發送數據!\n\n");
- //對MMA7455L的0x16寄存器寫配置數據0x05
- WriteByte_MMA7455L(0x16,0x05);
- //讀回0x16寄存器的配置值,判斷SPI通信是否成功.
- sta=ReadByte_MMA7455L(0x16);
- Uart_Printf("sta=0x%x",sta);
- while(1)
- {
- }
- }
- void WriteByte_MMA7455L(U8 addr,U8 dat)
- {
- int n;
- //片選CS置低,使能MMA7455為SPI模式
- rGPFDAT &= 0xef;
- Delay(1);
-
- Uart_Printf("SPI狀態寄存器的數據為0x%x!\n",rSPSTA0);
- while(!(rSPSTA0&0x01==0x01)) ;
- //高位置1寫操作
- rSPTDAT0 = 0x80|((addr & 0x3f)<<1);
- Uart_Printf("SPI狀態寄存器的數據為0x%x!\n",rSPSTA0);
- Uart_Printf("寫操作地址發送成功!\n");
- for(n=0;n<20;n++);
- Uart_Printf("SPI狀態寄存器的數據為0x%x!\n",rSPSTA0);
- while(!(rSPSTA0&0x01==0x01)) ;
- rSPTDAT0 = dat; //寫數據
- Uart_Printf("SPI狀態寄存器的數據為0x%x!\n",rSPSTA0);
- Uart_Printf("寫操作數據發送成功!\n");
- for(n=0;n<20;n++);
- //片選CS置高電平,結束SPI通信
- rGPFDAT |= 0xff;
- Delay(1);
- }
- U8 ReadByte_MMA7455L(U8 addr)
- {
- int n;
- U8 Re_Dat;
- //片選CS置低電平,使能MMA7455L為SPI模式
- rGPFDAT &= 0xef;
- Delay(1);
- Uart_Printf("SPI狀態寄存器的數據為0x%x!\n",rSPSTA0);
- while(!(rSPSTA0&0x01==0x01)) ;
- //讀操作高位清0
- rSPTDAT0 = (addr & 0x3f)<<1;
- Uart_Printf("SPI狀態寄存器的數據為0x%x!\n",rSPSTA0);
- Uart_Printf("讀操作地址發送成功!\n");
- for(n=0;n<20;n++);
- Uart_Printf("SPI狀態寄存器的數據為0x%x!\n",rSPSTA0);
- while(!(rSPSTA0&0x01==0x01));
- Re_Dat = rSPRDAT0;
- Uart_Printf("SPI狀態寄存器的數據為0x%x!\n",rSPSTA0);
- for(n=0;n<20;n++);
- //片選CS置高電平,結束SPI通信
- rGPFDAT |= 0xff;
- Delay(1);
- //返回讀取數據
- return Re_Dat;
- }
- //MMA7455L初始化
- void MMA7455L_INIT(void )
- {
- MMA_QUEUE.MMA_HEAD=0;
- MMA_QUEUE.MMA_CUR=0;
- SPI_WriteREG(0x16,0x05);//級別模式
- delay_nus(10);
- SPI_WriteREG(0x18,0x20);
- delay_nus(10);
- SPI_WriteREG(0x19,0x00);
- delay_nus(10);
- SPI_WriteREG(0x1a,0x00);
- delay_nus(10);
- }
- //SPI初始化
- void SPI_Init(void)
- {
- //激活時鐘控制器的SPI位
- rCLKCON |= 1 <<18;
- rSPCON0 = (0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(0<<1)|1;
- //查詢模式;SCK使能;主機模式;時鐘低電平有效;格式A;普通模式;
- //MMA7455的SPI的傳輸波特率在工作電壓小于2.4V時最高可達4MHz,大于2.4V時可達8MHz
- //SPI波特率為50MHz/2/(24+1)=1MHz
- rSPPRE0 = 24;
- }
復制代碼
所有資料51hei提供下載:
第4章.zip
(13.24 KB, 下載次數: 6)
2020-6-5 12:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|