您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 求助: 想使用spi中断处理,不能用查询法,弄... 
本帖共有7332个阅读者
发表帖子 发表投票 回复主题
求助: 想使用spi中断处理,不能用查询法,弄不出来,愁
szrong3000(论坛新手)
szrong3000
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:305
积分:27
注册时间:2012/1/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
求助: 想使用spi中断处理,不能用查询法,弄不出来,愁

昨天我发了个帖,关于spi通信。可能没说明白,今天重发一个,希望大家帮帮忙,快过年了,弄不出来,愁呀~~~

   1)用bf518的spi跟单片机数据传递;

  2)为slaver模式,使用spi1,

3) 必须用Spi1中断处理,因为用查询法接收数据总不完整;(这就是最烦人的地方)

如果不使用EX_INTERRUPT_HANDLER(sync_isr)和void spi_Interrupt(void);这两个函数,下面其它代码单程序运行while()是能收发数据的!!

现在就是想加入中断,能多线程并行,spi收发才能及时处理~~

=======================================================

主要代码如下:(其注释为存在疑问的地方)

EX_INTERRUPT_HANDLER(sync_isr)
{  

*pDMA7_IRQ_STATUS |= ???;  //还是用*pspi_STATUS = (????);  

  spi_sr(0x55);
}

void spi_Interrupt(void)
{
register_handler(ik_ivg7,sync_isr);  //此处中断向量和中断函数入口设置;
*pSIC_IAR6 &= 0xFFFFFFF0;

*pSIC_IAR6 |= 0xFFFFFFF0;  
*pSIC_IMASK1 |= ???;  //此处设置成任何数都不产生中断!!

}

//=============以下程序可以运行,也可以收发数据================

void spi_init(void)

{

    *pPORTH_FER   = 0x0000;/
     *pPORTH_MUX = 0x0000;  

    *pPORTHIO_DIR  = ( PH1);    

    *pPORTH_FER   |= (PH0|PH1|PH2|PH3);//

    *pPORTH_MUX = 0x0001;  // set SPI-Ports

*pSPI1_CTL  =  0x0030 ;  

*pSPI1_CTL |= (CPHA| CPOL);  

*pSPI1_CTL   = PSSE;

*pSPI1_CTL |= SPE;

*pSPI1_TDBR = 0x55;
}

spi_sr(0x55)

{

     if((*pSPI1_STAT & RXS))
    {
       data= *pSPI1_RDBR;

       *pSPI1_TDBR = ch;//直接把收到的数据又发出去;

       }

}

int main()

{  spi_init();

while(1)  // spi_sr(0x55);

{; }

}

//============================

还是想问问 有没有spi中断应用这方面的demo程序??

pdf反复看都没看懂怎么设置中断~~



「该帖子被 szrong3000 在 2012-01-11 21:33:32 编辑过」

blackfine 的初学者~~
等级:论坛新手 参考IP地址:*.*.*.*
2012/1/11 14:15:07
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
SPI_FLG  寄存器没有配置,没有告知CPU使用的是哪个片选接口,SPI_BAUD寄存器没有配置,没有设置通讯波特率,*pSIC_IMASK1 上次已告知如何配置。代码中没有使用DMA,进中断后不应该采用DMA标志位清除中断。
你在中断中加入一个打印函数,这样进中断了可以看到打印信息,另外可以查看SPI状态寄存器,看是否接收到数据。
我这里没有518板卡,只能帮你看看代码,无法帮你调试!

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/1/11 23:52:23
szrong3000(论坛新手)
szrong3000
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:305
积分:27
注册时间:2012/1/10
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
做从机 SPI_FLG  ,SPI_BAUD 可以不设置吧?我现在就想不用dma能进入中断~~

blackfine 的初学者~~
等级:论坛新手 参考IP地址:*.*.*.*
2012/1/12 8:41:20
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

哦,没注意是从机,从机不用配置,那就不知道了,只能一点一点调了。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/1/12 13:46:47
szrong3000(论坛新手)
szrong3000
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:305
积分:27
注册时间:2012/1/10
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

谢谢andy!!顺便说一下我现在情况:

用SPI的DMA中断我也弄OK了,但是不能在这里用; 我这项目通信方式是 收一个byte必须回一个byte,

所以我希望:

1) 在SPI1_RDBR有数据时 产生中断 (以前是轮询TXS,太耗时间),同时给SPI1_TDBR 一个byte发出去, 然后退出中断!

2)接着在SPI1_RDBR又有数据时产生中断,同时再发另一个 Byte;再结束中断;

..........................................

.n) 直到n个中断 产生 也 发送和接受了 n个BYTE ;

希望我表达清楚了,也希望有经验的朋友给点建议~~


blackfine 的初学者~~
等级:论坛新手 参考IP地址:*.*.*.*
2012/1/12 16:04:09
ppsca(论坛新手)
ppsca
头衔:社区公民
帮派:无帮无派
帖数:43
金钱:305
积分:41
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
如果你的中断OK的话,只需要在接收数据的中断函数中,加入数据发送的代码就可以了。

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2012/1/13 13:02:38
szrong3000(论坛新手)
szrong3000
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:305
积分:27
注册时间:2012/1/10
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

看了很久,终于发现是一个引脚的问题~,

真的谢谢adny,其实他上次说的就对了,是我自己没测量硬件~~



「该帖子被 szrong3000 在 2012-01-14 15:23:54 编辑过」

blackfine 的初学者~~
等级:论坛新手 参考IP地址:*.*.*.*
2012/1/14 13:41:53
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154028 Call, 1 Queries, Processed in 0.031250 second(s),