共2条
1/1 1 跳转至页
LPC2210,SPI1 LPC2210开发板的SPI1做从机中断方式接收数据的问题
问
/*SPI1初始化*/
S1PCR = 0x90; // 设置SPI1接口模式,MSTR=0,CPOL=1,CPHA=0,LSBF=0
/*中断使能*/
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x2b; // SPI1中断通道分配到IRQ slot 0
VICVectAddr0 = (int)IRQ_SPI1; // 设置SPI1向量地址
VICIntEnable = 0x00000800; // 使能SPI1中断
/*********************************************************************
SPI1中断接收
*********************************************************************/
void __irq IRQ_SPI1(void)
{
S1PINT = 0x01; /*清中断标志*/
if((S1PSR&0x80)!=0)
{
SPI1rcvdata = S1PDR;
}
if((S1PSR&0x10)!=0)
{
j = S1PSR;
VICVectAddr = 0x00; // 中断处理结束
return;
}
VICVectAddr = 0x00; // 中断处理结束
}
SPI1中断有关程序如上所示。
我把SPI0与SPI1对接,SPI0主机发送,SPI1从机接收,当SPI1采用查询接收的时候,能收到数据,但是采用中断方式,不进中断,请问可能是什么地方有问题?
完整程序如下(按照SPI示例修改而成):
/****************************************************************************
* 文件名:SPIDISP.C
* 功能:使用硬件SPI接口输出控制LED显示。(硬件:74HC595输出控制LED显示)
* 说明:将跳线器JP8短接,JP4断开。
****************************************************************************/
#include "config.h"
#define HC595_CS 0x00000100 /* P0.8口为74HC595的片选 */
uint8 SPI1rcvdata = 0x11,SPI1rcvdata1 = 0x11;
/* 显示数据 */
uint8 DISP_TAB = 0x55;
uint8 rcv_data=0,j=0,k=0;
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<5000; i++);
}
/****************************************************************************
* 名称:MSpiIni()
* 功能:初始化SPI接口。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void MSpiIni(void)
{ S0PCCR = 0x52; // 设置SPI0时钟分频
S0PCR = 0x30; // 设置SPI0接口模式,MSTR=1,CPOL=1,CPHA=0,LSBF=0
S1PCR = 0x90; // 设置SPI1接口模式,MSTR=0,CPOL=1,CPHA=0,LSBF=0
}
/****************************************************************************
* 名称:MSendData()
* 功能:向SPI总线发送数据,并接收从机发回的数据。
* 入口参数:data 待发送的数据
* 出口参数:返回值为接收到的数据
****************************************************************************/
uint8 MSendData(uint8 data)
{
// IO0CLR = HC595_CS; // 片选
S0PDR = data;
while( 0==(S0PSR&0x80) ); // 等待SPIF置位,即等待数据发送完毕
// IO0SET = HC595_CS;
return(S0PDR);
}
/*****************************************************************************
SPI1中断接收
******************************************************************************/
void __irq IRQ_SPI1(void)
{
S1PINT = 0x01; /*清中断标志*/
if((S1PSR&0x80)!=0)
{
SPI1rcvdata = S1PDR;
}
if((S1PSR&0x10)!=0)
{
j = S1PSR;
VICVectAddr = 0x00; // 中断处理结束
return;
}
VICVectAddr = 0x00; // 中断处理结束
}
/****************************************************************************
SPI1查询方式接收
*****************************************************************************/
void SPI1rcv_data(void)
{
while((S1PSR&0x80)==0);
k = S1PSR;
SPI1rcvdata1 = S1PDR;
}
/****************************************************************************
* 名称:main()
* 功能:使用硬件SPI接口输出DISP_TAB数组的数据,控制LED显示。
****************************************************************************/
int main(void)
{
PINSEL0 = 0x00005500; // 设置SPI0管脚连接?
PINSEL1 = 0x000002a8; // 设置SPI1管脚连接
IO0DIR = HC595_CS;
MSpiIni(); // 初始化SPI接口
/*中断使能*/
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x2b; // SPI1中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_SPI1; // 设置SPI1向量地址
VICIntEnable = 0x00000800; // 使能SPI1中断
while(1)
{
rcv_data = MSendData(~DISP_TAB); // 发送数据
// SPI1rcv_data(); //查询接收数据
DelayNS(10);
}
return(0);
} 答 1: spi的中断几乎没有用如果你单步调试不用查询的方式是接收不到数据的。我的试验得结果是这样的。开了从模式机子的中断后主机发数据后不进中断服务程序。只有你在查询的时候在这条指令
void Spi0RcvData(uint8 *buf)
{
while(0==(S0PSR&0x80));在这条指令等待中S0PSR最高位是1后,程序才会跳进SPI0的中断服务程序里面。
*buf=S0PDR;
}
不知道其他朋友有没有遇到这样的问题,或是实现了SPI从模式的中断接收功能。在线等待朋友们的指导,谢谢.....
S1PCR = 0x90; // 设置SPI1接口模式,MSTR=0,CPOL=1,CPHA=0,LSBF=0
/*中断使能*/
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x2b; // SPI1中断通道分配到IRQ slot 0
VICVectAddr0 = (int)IRQ_SPI1; // 设置SPI1向量地址
VICIntEnable = 0x00000800; // 使能SPI1中断
/*********************************************************************
SPI1中断接收
*********************************************************************/
void __irq IRQ_SPI1(void)
{
S1PINT = 0x01; /*清中断标志*/
if((S1PSR&0x80)!=0)
{
SPI1rcvdata = S1PDR;
}
if((S1PSR&0x10)!=0)
{
j = S1PSR;
VICVectAddr = 0x00; // 中断处理结束
return;
}
VICVectAddr = 0x00; // 中断处理结束
}
SPI1中断有关程序如上所示。
我把SPI0与SPI1对接,SPI0主机发送,SPI1从机接收,当SPI1采用查询接收的时候,能收到数据,但是采用中断方式,不进中断,请问可能是什么地方有问题?
完整程序如下(按照SPI示例修改而成):
/****************************************************************************
* 文件名:SPIDISP.C
* 功能:使用硬件SPI接口输出控制LED显示。(硬件:74HC595输出控制LED显示)
* 说明:将跳线器JP8短接,JP4断开。
****************************************************************************/
#include "config.h"
#define HC595_CS 0x00000100 /* P0.8口为74HC595的片选 */
uint8 SPI1rcvdata = 0x11,SPI1rcvdata1 = 0x11;
/* 显示数据 */
uint8 DISP_TAB = 0x55;
uint8 rcv_data=0,j=0,k=0;
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<5000; i++);
}
/****************************************************************************
* 名称:MSpiIni()
* 功能:初始化SPI接口。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void MSpiIni(void)
{ S0PCCR = 0x52; // 设置SPI0时钟分频
S0PCR = 0x30; // 设置SPI0接口模式,MSTR=1,CPOL=1,CPHA=0,LSBF=0
S1PCR = 0x90; // 设置SPI1接口模式,MSTR=0,CPOL=1,CPHA=0,LSBF=0
}
/****************************************************************************
* 名称:MSendData()
* 功能:向SPI总线发送数据,并接收从机发回的数据。
* 入口参数:data 待发送的数据
* 出口参数:返回值为接收到的数据
****************************************************************************/
uint8 MSendData(uint8 data)
{
// IO0CLR = HC595_CS; // 片选
S0PDR = data;
while( 0==(S0PSR&0x80) ); // 等待SPIF置位,即等待数据发送完毕
// IO0SET = HC595_CS;
return(S0PDR);
}
/*****************************************************************************
SPI1中断接收
******************************************************************************/
void __irq IRQ_SPI1(void)
{
S1PINT = 0x01; /*清中断标志*/
if((S1PSR&0x80)!=0)
{
SPI1rcvdata = S1PDR;
}
if((S1PSR&0x10)!=0)
{
j = S1PSR;
VICVectAddr = 0x00; // 中断处理结束
return;
}
VICVectAddr = 0x00; // 中断处理结束
}
/****************************************************************************
SPI1查询方式接收
*****************************************************************************/
void SPI1rcv_data(void)
{
while((S1PSR&0x80)==0);
k = S1PSR;
SPI1rcvdata1 = S1PDR;
}
/****************************************************************************
* 名称:main()
* 功能:使用硬件SPI接口输出DISP_TAB数组的数据,控制LED显示。
****************************************************************************/
int main(void)
{
PINSEL0 = 0x00005500; // 设置SPI0管脚连接?
PINSEL1 = 0x000002a8; // 设置SPI1管脚连接
IO0DIR = HC595_CS;
MSpiIni(); // 初始化SPI接口
/*中断使能*/
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x2b; // SPI1中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_SPI1; // 设置SPI1向量地址
VICIntEnable = 0x00000800; // 使能SPI1中断
while(1)
{
rcv_data = MSendData(~DISP_TAB); // 发送数据
// SPI1rcv_data(); //查询接收数据
DelayNS(10);
}
return(0);
} 答 1: spi的中断几乎没有用如果你单步调试不用查询的方式是接收不到数据的。我的试验得结果是这样的。开了从模式机子的中断后主机发数据后不进中断服务程序。只有你在查询的时候在这条指令
void Spi0RcvData(uint8 *buf)
{
while(0==(S0PSR&0x80));在这条指令等待中S0PSR最高位是1后,程序才会跳进SPI0的中断服务程序里面。
*buf=S0PDR;
}
不知道其他朋友有没有遇到这样的问题,或是实现了SPI从模式的中断接收功能。在线等待朋友们的指导,谢谢.....
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |