您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 刚开始bf518,spi中断都不知道怎么弄--救命... 
本帖共有1459个阅读者
发表帖子 发表投票 回复主题
刚开始bf518,spi中断都不知道怎么弄--救命
szrong3000(论坛新手)
szrong3000
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:305
积分:27
注册时间:2012/1/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
刚开始bf518,spi中断都不知道怎么弄--救命

各位大虾:

   我想用bf518的spi跟单片机数据传递;

  为slaver模式,想试用spi1,普通 statuer样式;因为还不知道用DMA;

  根据pdf文档,spi中断设置如下:但怎么也产生不了中断!!

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

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

EX_INTERRUPT_HANDLER(sync_isr)
{  

*pDMA7_IRQ_STATUS |= ???;  //此处不知道怎么设

   spi_sr(0x55);
}

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

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

}

void spi_sr(char data)  //spi 收发数据

{  while((*pSPI1_STAT & RXS))
     {
        data= *pSPI1_RDBR; //读取数据
        SPI_SendData(data);
     }

}

void spi_init(void)

{

*pSPI1_CTL  =  0x0030 ;  

*pSPI1_CTL |= (CPHA| CPOL);  

*pSPI1_CTL   = PSSE;

*pSPI1_CTL |= SPE;

*pSPI1_TDBR = 0x55;
}

int main()

{

  

   spi_init();

    while(1){;}

}

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

上面的spi中断一直不会进入,郁闷呀~~

谁有没有spi中断应用这方面的demo程序??





「该帖子被 szrong3000 在 2012-01-10 13:36:35 编辑过」

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

使用SPI接口,首先要分配接口功能,你的代码中看不到,也就是说你的硬件没有设置SPI接口,没有办法进行SPI接口通讯。

void spi_init(void)  这个函数中没有SPI配置的速度,以及使用的SPI片选的接口是哪个。

*pSIC_IMASK1 |= ???; 通过查表得,SPI1的数据状态中断位于bit16,需要将bit16设置为1.

*pDMA7_IRQ_STATUS |= ???; 你没有使用DMA,所以清除中断标志位不应使用DMA的中断状态,应使用SPI_STAT进行清除终端数据状态。

你在调试时可以不使用中断,直接通过访问SPI_STAT寄存器判断是否有接收到数据,等接收正常后再开中断。



这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/1/10 18:10:26
尊贵身份标志
夜色飘摇(论坛版主)
夜色飘摇
头衔:社区公民
帮派:无帮无派
帖数:350
金钱:1773
积分:332
注册时间:2011/6/8
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
518上没有中断应用方面的demo

我要成为勇敢的海上战士!
等级:论坛版主 参考IP地址:*.*.*.*
2012/1/10 18:47:35
szrong3000(论坛新手)
szrong3000
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:305
积分:27
注册时间:2012/1/10
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

谢谢各位

昨天代码SPI1_init里少写了 spi1口使用

void SPI1_init(void)
{
    *pPORTH_FER   = 0x0000;
     *pPORTH_MUX = 0x0000;  

    *pPORTHIO_DIR  = ( PH1);    

    *pPORTH_FER   |= (PH0|PH1|PH2|PH3);
    *pPORTH_MUX = 0x0001;

(以下相同,不重复)

}

对于while((*pSPI1_STAT & RXS))这种轮询收发数据是ok的,但是这种方式太耗时间,我想开启spi中断(只要rxs有数据,立马中断处理,不想轮询,),是不是要使用dma?????


blackfine 的初学者~~
等级:论坛新手 参考IP地址:*.*.*.*
2012/1/11 13:47:19
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
SPI接口可以在不使用DMA时采用中断,SPI_CTL寄存器有配置。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/1/11 23:40:10
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154171 Call, 1 Queries, Processed in 0.015625 second(s),