標(biāo)題:
2440驅(qū)動(dòng)MMA7455L源程序
[打印本頁]
作者:
1551531584
時(shí)間:
2020-6-5 12:23
標(biāo)題:
2440驅(qū)動(dòng)MMA7455L源程序
51hei.png
(23.9 KB, 下載次數(shù): 115)
下載附件
2020-6-5 17:32 上傳
單片機(jī)源程序如下:
/****************************************************************
文件名: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; //結(jié)果為0x96=150
p = (val>>4)&0x3f; //結(jié)果為0x03=3
s = val&3; //結(jié)果為0
//(m+8)*FIN*2 不要超出32位數(shù)!
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); //延時(shí)10ms讓IIC和SPI準(zhǔn)備就緒
Uart_Printf("CLKCON=%x!",rCLKCON);
Uart_Printf("開始發(fā)送數(shù)據(jù)!\n\n");
//對(duì)MMA7455L的0x16寄存器寫配置數(shù)據(jù)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狀態(tài)寄存器的數(shù)據(jù)為0x%x!\n",rSPSTA0);
while(!(rSPSTA0&0x01==0x01)) ;
//高位置1寫操作
rSPTDAT0 = 0x80|((addr & 0x3f)<<1);
Uart_Printf("SPI狀態(tài)寄存器的數(shù)據(jù)為0x%x!\n",rSPSTA0);
Uart_Printf("寫操作地址發(fā)送成功!\n");
for(n=0;n<20;n++);
Uart_Printf("SPI狀態(tài)寄存器的數(shù)據(jù)為0x%x!\n",rSPSTA0);
while(!(rSPSTA0&0x01==0x01)) ;
rSPTDAT0 = dat; //寫數(shù)據(jù)
Uart_Printf("SPI狀態(tài)寄存器的數(shù)據(jù)為0x%x!\n",rSPSTA0);
Uart_Printf("寫操作數(shù)據(jù)發(fā)送成功!\n");
for(n=0;n<20;n++);
//片選CS置高電平,結(jié)束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狀態(tài)寄存器的數(shù)據(jù)為0x%x!\n",rSPSTA0);
while(!(rSPSTA0&0x01==0x01)) ;
//讀操作高位清0
rSPTDAT0 = (addr & 0x3f)<<1;
Uart_Printf("SPI狀態(tài)寄存器的數(shù)據(jù)為0x%x!\n",rSPSTA0);
Uart_Printf("讀操作地址發(fā)送成功!\n");
for(n=0;n<20;n++);
Uart_Printf("SPI狀態(tài)寄存器的數(shù)據(jù)為0x%x!\n",rSPSTA0);
while(!(rSPSTA0&0x01==0x01));
Re_Dat = rSPRDAT0;
Uart_Printf("SPI狀態(tài)寄存器的數(shù)據(jù)為0x%x!\n",rSPSTA0);
for(n=0;n<20;n++);
//片選CS置高電平,結(jié)束SPI通信
rGPFDAT |= 0xff;
Delay(1);
//返回讀取數(shù)據(jù)
return Re_Dat;
}
//MMA7455L初始化
void MMA7455L_INIT(void )
{
MMA_QUEUE.MMA_HEAD=0;
MMA_QUEUE.MMA_CUR=0;
SPI_WriteREG(0x16,0x05);//級(jí)別模式
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)
{
//激活時(shí)鐘控制器的SPI位
rCLKCON |= 1 <<18;
rSPCON0 = (0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(0<<1)|1;
//查詢模式;SCK使能;主機(jī)模式;時(shí)鐘低電平有效;格式A;普通模式;
//MMA7455的SPI的傳輸波特率在工作電壓小于2.4V時(shí)最高可達(dá)4MHz,大于2.4V時(shí)可達(dá)8MHz
//SPI波特率為50MHz/2/(24+1)=1MHz
rSPPRE0 = 24;
}
復(fù)制代碼
所有資料51hei提供下載:
第4章.zip
(13.24 KB, 下載次數(shù): 6)
2020-6-5 12:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1