#include "p33Fxxxx.h"
#include "func.h"
#include "Mac_def.h"
#define KXR_CS_1 LATGbits.LATG15 =1
#define KXR_CS_0 LATGbits.LATG15 =0
#define SPI1_DSPRAM_LEN 2
extern unsigned char System_Step;
Tri_Axis_Value Raw_Accel;
unsigned char SPI1_TxBufferA[SPI1_DSPRAM_LEN] __attribute__((space(dma)));
unsigned char SPI1_RxBufferA[SPI1_DSPRAM_LEN] __attribute__((space(dma)));
unsigned char KXR94_Step_Op =0;
unsigned char DAM7_RX_OVER =0;
void DMA6_7_SPI1_Init(void)
{
TRISGbits.TRISG15 =0;//KXR94 _CS,配置为输出
KXR_CS_1;
SPI1CON1bits.PPRE =1;//主分频1:16
SPI1CON1bits.SPRE =6;//辅分频1:2;
SPI1CON1bits.SSEN =0;//SS片选信号引脚无用,由IO口控制
SPI1CON1bits.DISSCK = 0; //Internal Serial Clock is Enabled.
SPI1CON1bits.DISSDO = 0; //SDOx pin is controlled by the module.
SPI1CON1bits.MODE16 = 0; //Communication is Byte-wide (16 bits).
SPI1CON1bits.SMP = 0; //Input Data is sampled at the middle of data output time.
SPI1CON1bits.CKE = 1; //Serial output data changes on transition from
//Idle clock state to active clock state
SPI1CON1bits.CKP = 0; //Idle state for clock is a low level;
//active state is a high level
SPI1STATbits.SPISIDL =0;//空闲时处于工作状态
SPI1CON1bits.MSTEN = 1; //Master Mode Enabled
SPI1STATbits.SPIEN = 1; //Enable SPI Module
SPI1STATbits.SPIROV =0;
//DMA6通道作为SPI1 TX配置
DMA6CONbits.SIZE =1;//字节发送宽度
DMA6CONbits.DIR =1;//从DPSRAM 地址读取,写外设入地址
DMA6CONbits.HALF =0;//当发送了所有数据时,发出中断
DMA6CONbits.NULLW =0;//正常工作
DMA6CONbits.AMODE =0;//带后递增的寄存器间接寻址模式
DMA6CONbits.MODE =1;//禁止单数据块乒乓模式
DMA6CNT =1; // DMA requests
DMA6REQ =0b0001010; // Select SPI2 MOSI
DMA6PAD = (volatile unsigned int) &SPI1BUF;
DMA6STA = __builtin_dmaoffset(SPI1_TxBufferA);
IFS4bits.DMA6IF = 0; // Clear DMA interrupt
IEC4bits.DMA6IE = 1; // Enable DMA interrupt
//DMA7通道作为SPI1 RX配置
DMA7CONbits.SIZE =1;//字接受宽度
DMA7CONbits.DIR =0;//从外设地址读取,写入DPSRAM 地址
DMA7CONbits.HALF =0;//当接受了所有数据时,发出中断
DMA7CONbits.NULLW =0;//正常工作
DMA7CONbits.AMODE =0;//带后递增的寄存器间接寻址模式
DMA7CONbits.MODE =1;//禁止单数据块乒乓模式
DMA7CNT =1; // DMA requests
DMA7REQ =0b0001010; // Select SPI1 MOSI
DMA7PAD = (volatile unsigned int) &SPI1BUF;
DMA7STA = __builtin_dmaoffset(SPI1_RxBufferA);
IFS4bits.DMA7IF = 0; // Clear DMA interrupt
IEC4bits.DMA7IE = 1; // Enable DMA interrupt
SPI1_TxBufferA[0]=0x04;
SPI1_TxBufferA[1]=0x04;
KXR94_Step_Op =0;
DAM7_RX_OVER =0;
DMA6CONbits.CHEN = 1; // Enable DMA6Channel
DMA7CONbits.CHEN = 1; // Enable DMA7 Channel
KXR_CS_0;
DMA6REQbits.FORCE = 1; // Manual mode:Kick-start the 1st transfer
}
void __attribute__((__interrupt__,no_auto_psv)) _DMA6Interrupt(void)
{
IFS4bits.DMA6IF = 0; // Clear the DMA6 Interrupt Flag
}
void __attribute__((__interrupt__,no_auto_psv)) _DMA7Interrupt(void)//DMA7
{
if(KXR94_Step_Op ==0 || KXR94_Step_Op ==2 || KXR94_Step_Op ==4 || KXR94_Step_Op ==6) KXR_CS_1;
DAM7_RX_OVER =1;
IFS4bits.DMA7IF = 0; // Clear the DMA7 Interrupt Flag
}
void Delay_40uS(void)
{
unsigned int i=0;
for(i=0;i<300;i++);
}
void Delay_200nS(void)
{
unsigned int i=0;
for(i=0;i<100;i++);
}
void Start_Accel_Sample(void)
{
uINT16 RX_Data;
signed int Temp =0;
if(DMA6REQbits.FORCE || DAM7_RX_OVER ==0) return;
DAM7_RX_OVER =0;
switch(KXR94_Step_Op)
{
case 0:KXR94_Step_Op =1;
SPI1_TxBufferA[0] =0x00;
Delay_200nS();
DMA6CNT =0;
DMA7CNT =0;
DMA6STA = __builtin_dmaoffset(SPI1_TxBufferA);
DMA7STA = __builtin_dmaoffset(SPI1_RxBufferA);
DMA6CONbits.CHEN = 1; // Enable DMA6Channel
DMA7CONbits.CHEN = 1; // Enable DMA7 Channel
DMA6REQbits.FORCE = 1; // Manual mode:Kick-start the 1st transfer
KXR_CS_0;
break;
case 1:KXR94_Step_Op =2;
SPI1_TxBufferA[0] =0x00;
SPI1_TxBufferA[1] =0x00;
Delay_40uS();
DMA6CNT =1;
DMA7CNT =1;
DMA6STA = __builtin_dmaoffset(SPI1_TxBufferA);
DMA7STA = __builtin_dmaoffset(SPI1_RxBufferA);
DMA6CONbits.CHEN = 1; // Enable DMA6Channel
DMA7CONbits.CHEN = 1; // Enable DMA7 Channel
DMA6REQbits.FORCE = 1; // Manual mode:Kick-start the 1st transfer
break;
case 2:RX_Data .Uint[1]=SPI1_RxBufferA[0];
RX_Data .Uint[0]=SPI1_RxBufferA[1];
RX_Data.VLI >>=4;
RX_Data.VLI &=0x0fff;
if(RX_Data.VLI >=2048) Temp =RX_Data.VLI - 2048;
else {Temp =2048 - RX_Data.VLI;Temp =-Temp;}
Raw_Accel.Roll.zero =(-1.0)*(float)Temp/819.0;
KXR94_Step_Op =3;
SPI1_TxBufferA[0] =0x01;
Delay_200nS();
DMA6CNT =0;
DMA7CNT =0;
DMA6STA = __builtin_dmaoffset(SPI1_TxBufferA);
DMA7STA = __builtin_dmaoffset(SPI1_RxBufferA);
DMA6CONbits.CHEN = 1; // Enable DMA7 Channel
DMA7CONbits.CHEN = 1; // Enable DMA7 Channel
DMA6REQbits.FORCE = 1; // Manual mode:Kick-start the 1st transfer
KXR_CS_0;
break;
case 3:KXR94_Step_Op =4;
SPI1_TxBufferA[0] =0x00;
SPI1_TxBufferA[1] =0x00;
Delay_40uS();
DMA6CNT =1;
DMA7CNT =1;
DMA6STA = __builtin_dmaoffset(SPI1_TxBufferA);
DMA7STA = __builtin_dmaoffset(SPI1_RxBufferA);
DMA6CONbits.CHEN = 1; // Enable DMA6Channel
DMA7CONbits.CHEN = 1; // Enable DMA7 Channel
DMA6REQbits.FORCE = 1; // Manual mode:Kick-start the 1st transfer
break;
case 4:RX_Data .Uint[1]=SPI1_RxBufferA[0];
RX_Data .Uint[0]=SPI1_RxBufferA[1];
RX_Data.VLI >>=4;
RX_Data.VLI &=0x0fff;
if(RX_Data.VLI >=2048) Temp =RX_Data.VLI - 2048;
else {Temp =2048 - RX_Data.VLI;Temp =-Temp;}
Raw_Accel.Pitch.zero =((float)Temp)/819.0;
KXR94_Step_Op =5;
SPI1_TxBufferA[0] =0x02;
Delay_200nS();
DMA6CNT =0;
DMA7CNT =0;
DMA6STA = __builtin_dmaoffset(SPI1_TxBufferA);
DMA7STA = __builtin_dmaoffset(SPI1_RxBufferA);
DMA7CONbits.CHEN = 1; // Enable DMA7 Channel
DMA6CONbits.CHEN = 1; // Enable DMA6Channel
DMA6REQbits.FORCE = 1; // Manual mode:Kick-start the 1st transfer
KXR_CS_0;
break;
case 5:KXR94_Step_Op =6;
SPI1_TxBufferA[0] =0x00;
SPI1_TxBufferA[1] =0x00;
Delay_40uS();
DMA6CNT =1;
DMA7CNT =1;
DMA6STA = __builtin_dmaoffset(SPI1_TxBufferA);
DMA7STA = __builtin_dmaoffset(SPI1_RxBufferA);
DMA7CONbits.CHEN = 1; // Enable DMA7 Channel
DMA6CONbits.CHEN = 1; // Enable DMA6Channel
DMA6REQbits.FORCE = 1; // Manual mode:Kick-start the 1st transfer
break;
case 6:KXR94_Step_Op =0;
RX_Data .Uint[1]=SPI1_RxBufferA[0];
RX_Data .Uint[0]=SPI1_RxBufferA[1];
RX_Data.VLI >>=4;
RX_Data.VLI &=0x0fff;
if(RX_Data.VLI >=2048)
{
Temp =RX_Data.VLI - 2048;
Temp =-Temp;
}
else Temp =2048 - RX_Data.VLI;
SPI.zip_PIC Spi DMA_PIC spi_kxr94-2050_pic DMA_加速度计控制
版权申诉
149 浏览量
2022-09-24
05:43:57
上传
评论
收藏 2KB ZIP 举报
JaniceLu
- 粉丝: 79
- 资源: 1万+
最新资源
- BGP路由基本配置(拓扑图画好,ip配好了)
- C#的前置窗口截图工具
- 基于Flask开发后端、VUE开发前端框架,在WEB端部署YOLOv5目标检测模型
- kubekeyv3.0.13
- 基于SHT25温湿度传感器、FREERTOS、STM32F103C8T6、LCD1602温湿度采集显示系统proteus仿真设计
- C# 屏幕放大取色器 随时随地获取屏幕像素颜色
- 下载安装这个软件.apk
- 【数据集详细解释及案例分析】数据集详细解释及案例分析
- 基于SHT71温湿度传感器、STM32F103C8T6、LCD1602温湿度采集显示系统proteus仿真设计
- 基于TH02温湿度传感器、STM32F103C8T6、LCD1602、FREERTOS的温湿度采集系统proteus仿真设计
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈