在线时间4 小时
UID331087
注册时间2017-1-10
NXP金币0
该用户从未签到
新手上路

- 积分
- 34
- 最后登录
- 2017-1-23
|
本帖最后由 oucaijun 于 2017-1-22 15:38 编辑
有用飞思卡尔 ksdk1.2做过spi dma传输的吗?希望做过的联系一下我。感谢,有红包哦。一定是要真正做过的,不然很难交流
----------
需求: 使用MK66的spi dma功能
----------
BASE ENVIROMENT:
单片机:nxp的MK66FX1M0VLQ18
发工具: MDK5.0 + JLINK
SDK: Freescale KSDK_1.2.0
情况:
MK66的单片机外接ads1256的AD采集芯片。
连接情况:
MK66的单片机SPI0 |-- ads1256芯片0
|-- ads1256芯片1
|-- ads1256芯片2
MK66的单片机SPI2 --- ads1256芯片3
-----------
1 现有方案:
MK66在收到READY脉冲后,该中断里面发出消息notify0,1,2,3。APP里面发现四个通道的消息都收到以后,立即读取使用KSDK_1.2.0的DSPI_DRV_MasterTransferBlocking,读取AD芯片的寄存器,完成数据采集。
ads1256芯片0 READY INT --> notify[0] --|
ads1256芯片1 READY INT --> notify[1] --|
ads1256芯片2 READY INT --> notify[2] --|
ads1256芯片3 READY INT --> notify[3] --|
--> "四个通道都收到notify"事件
--> APP读取AD数据
2 问题:
100 0000多次采集之后,发现READY中断发出的消息个数notify[0]=100 0077; notify[1]=100 0079; notify[2]=100 0082; notify[3]= 1000085;
APP里面"四个通道都收到notify"这样的事件个数为 1000042
漏采率: 4 / 10000
3 我认为问题的原因:
APP读取AD数据时,是读AD的寄存器。这是外接AD芯片,因此读取速度受spi时钟的限制。可能在APP处理"四个通道都收到notify"事件过程中,漏掉新的notify事件,期望通过减少APP读取AD数据的时间,减少漏采率。
4 我认为的提升空间:
MK66开启SPI DMA模式,当每个AD芯片数据来之后,自动传输到内存buffer0,1,2,3。
期望通过这样,APP读取AD数据不再是读AD的寄存器【这是外接AD芯片,因此读取速度受spi时钟的限制】,处理"四个通道都收到notify"事件的速度提升之后,减少漏报率。
5 我的尝试和结果:
先试一路AD的SPI+DMA,使用Freescale KSDK_1.2.0 DMA的API接口。
ad_chip_init();//和原方案不变,检查确保读写ad芯片无误
//重新初始化dma+spi:
// Init eDMA modules.
edmaUserConfig.chnArbitration = kEDMAChnArbitrationRoundrobin;
edmaUserConfig.notHaltOnError = false;
EDMA_DRV_Init(&edmaState, &edmaUserConfig);
uint8_t destAddr[BUFFER_SIZE];
srcSG.address = (uint32_t)(SPI2_POPR); //TO BE REVIEW
destSG.address = (uint32_t)destAddr;
srcSG.length = BUFFER_SIZE=3;
destSG.length = BUFFER_SIZE=3;
EDMA_DRV_RequestChannel(dma_channel=0, kDmaRequsetMux0SPI2Rx, &chnState); //TO BE REVIEW
EDMA_DRV_ConfigScatterGatherTransfer(&chnState, stcd, kEDMAPeripheralToMemory, //TO BE REVIEW
EDMA_TRANSFER_SIZE=1, EDMA_WARTERMARK_LEVEL=3,
&srcSG, &destSG,
EDMA_CHAIN_LENGTH=1);
EDMA_DRV_InstallCallback(&chnState, EDMA_Callback, NULL);
EDMA_DRV_StartChannel(&chnState);
EDMACallback{
post_notify_event();
}
APP {
ret = wait_notify_event();
if(ret==OK) save_ad_data();
}
结果:
IN APP {
ret = wait_notify_event(); // ret = TIMEOUT; --> then HARDFAULT
}
|
|