共2条
1/1 1 跳转至页
2131,spi 2131的spi的中断问题

问
2131开发板问题:我自己写了一段程序,大体和例程差不多,是以spi为主机,ssp为从机,但总是在判断spi状态寄存器的spif位上死循环,后我把书中的程序拷贝了,但出现了无法产生读中断,不知道为什么,我确认连线没问题 ,请大侠帮忙解答这两个问题,以下是我写的程序:
#include "config.h"
#define key1 1<<17 //key1---p0.16
#define key2 1<<18 //key2---p0.17
#define led1 1<<18 //led1---p1.18
#define led2 1<<19 //led2---p1.19
#define led3 1<<20 //led3---p1.20
#define led4 1<<21 //led4---p1.21
#define led5 1<<22 //led5---p1.22
#define led6 1<<23 //led6---p1.23
#define led7 1<<24 //led7---p1.24
#define led8 1<<25 //led8---p1.25
#define hc595 1<<29
#define slave_cs 1<<28 //p0.28作为ssp作为从机的片选信号
#define beep 1<<7
unsigned char recv_flag;
unsigned int recv_temp;
unsigned int recv_lib[16];
uint8 display[16] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,
0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E};
unsigned int i;
/*1***********************************************************/
void delay(unsigned char n) //延时
{。。。。。。
}
/*2**********************************************************/
void looplighting(void) //跑马等循环点亮子程序
{
。。。。。。。。。
}
/*3***********************************************************/
void ssp_initial(void) //ssp初始化
{
SSPCR0=(1<<8)| //SCR设置为1
(0x03<<7)| //CPHA=1,CPOL=1
(0x00<<5)| //帧格式选用spi
(7<<0) ; //数据长度选用8位
SSPCR1=(0<<3)| //从机输出禁能
(1<<2)| //设置ssp为从机
(1<<1)| //ssp使能
(0<<0); //禁能回写模式
SSPCPSR=0x04; //f=(pclk/(cpsdvsr*(scr+1))=pclk/(4*(1+1))
SSPICR=0X03; //清除中断
}
/*4*************************************************************/
void spi_initial(void) //isp初始化
{
S0PCR=(0x03<<4)| //spi的控制寄存器CPHA=1,CPOL=1
(1<<5)| //设置spi为主机
(0<<6)| //spi传送msb在先
(1<<7); //spi中断使能
SPCCR=0x08; //spi的spccr必须大于等于8,因而spi速率最大为fpclk的1/8
S0PINT=0x00; //中断清零
}
/*5***************************************************************/
void __irq read_from_spi(void)
{
recv_temp=SSPDR; //接收数据
recv_lib[i]=recv_temp;
if(i<16)
{
i++;
}
else i=0;
recv_flag=1;
SSPICR=0x03; //清除中断
VICVectAddr=0x00;
}
/*7****************************************************************************/
void ssp_send_data(void) //ssp驱动数码管
{
IO0CLR=hc595 ;
SSPDR=recv_lib[i];
if(i<16)
i++;
else i=0;
while((SSPSR&0x01)==0);
return;
}
/*8***********************************************************************/
void spi_send_data(unsigned char *data_pointer)
{
IOCLR=slave_cs;
SPDR=(*data_pointer);
while((S0PSR&0x80)==0); //程序运行到这里死循环
IOSET=slave_cs;
return;
}
int main(void)
{
unsigned char n=3,j;
unsigned char *p;
p=display;
PINSEL0=0x00005500; //p0.4(9:8=01)-sck0 ,p0.5(11:10=01)-miso0
//p0.6(13:12=01)-mosi0, p0.7(15:14=01)-sel0
PINSEL1=0x000002a9; //p0.16(1:0=01)-eint0,p0.17(3:2=10)-sck1,
//p0.18(5:4=10)-miso1,p0.19(7:6=10)-mosi1
//p0.20(9:8=10)-ssel1,
IO1SET=(led1|led2|led3|led4|led5|led6|led7|led8);
IO1DIR=(led1|led2|led3|led4|led5|led6|led7|led8);
ssp_initial(); //ssp初始化
spi_initial(); //isp初始化
IRQEnable();
VICIntSelect=0x00000000;
VICVectCntl0=0x20|14 ; //使能spi0,
VICVectAddr0=(uint32)read_from_spi; //设置中断服务程序地址
VICIntEnable=(1<<0x0a); //允许spi0,eint0
for(j=0;j<16;j++)
{
spi_send_data(p);
delay(n);
IO0SET=slave_cs; //片选信号拉高进入主机模式
S0PCR=(1<<5); //S0PCR 的 MSTR位置1,把spi设置为主机
if(recv_flag==0)
ssp_send_data();
delay(n);
}
return (0);
}
答 1: 有没有哪位朋友知道这个问题啊有没有哪位朋友知道这个问题啊,很急,谢谢
#include "config.h"
#define key1 1<<17 //key1---p0.16
#define key2 1<<18 //key2---p0.17
#define led1 1<<18 //led1---p1.18
#define led2 1<<19 //led2---p1.19
#define led3 1<<20 //led3---p1.20
#define led4 1<<21 //led4---p1.21
#define led5 1<<22 //led5---p1.22
#define led6 1<<23 //led6---p1.23
#define led7 1<<24 //led7---p1.24
#define led8 1<<25 //led8---p1.25
#define hc595 1<<29
#define slave_cs 1<<28 //p0.28作为ssp作为从机的片选信号
#define beep 1<<7
unsigned char recv_flag;
unsigned int recv_temp;
unsigned int recv_lib[16];
uint8 display[16] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,
0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E};
unsigned int i;
/*1***********************************************************/
void delay(unsigned char n) //延时
{。。。。。。
}
/*2**********************************************************/
void looplighting(void) //跑马等循环点亮子程序
{
。。。。。。。。。
}
/*3***********************************************************/
void ssp_initial(void) //ssp初始化
{
SSPCR0=(1<<8)| //SCR设置为1
(0x03<<7)| //CPHA=1,CPOL=1
(0x00<<5)| //帧格式选用spi
(7<<0) ; //数据长度选用8位
SSPCR1=(0<<3)| //从机输出禁能
(1<<2)| //设置ssp为从机
(1<<1)| //ssp使能
(0<<0); //禁能回写模式
SSPCPSR=0x04; //f=(pclk/(cpsdvsr*(scr+1))=pclk/(4*(1+1))
SSPICR=0X03; //清除中断
}
/*4*************************************************************/
void spi_initial(void) //isp初始化
{
S0PCR=(0x03<<4)| //spi的控制寄存器CPHA=1,CPOL=1
(1<<5)| //设置spi为主机
(0<<6)| //spi传送msb在先
(1<<7); //spi中断使能
SPCCR=0x08; //spi的spccr必须大于等于8,因而spi速率最大为fpclk的1/8
S0PINT=0x00; //中断清零
}
/*5***************************************************************/
void __irq read_from_spi(void)
{
recv_temp=SSPDR; //接收数据
recv_lib[i]=recv_temp;
if(i<16)
{
i++;
}
else i=0;
recv_flag=1;
SSPICR=0x03; //清除中断
VICVectAddr=0x00;
}
/*7****************************************************************************/
void ssp_send_data(void) //ssp驱动数码管
{
IO0CLR=hc595 ;
SSPDR=recv_lib[i];
if(i<16)
i++;
else i=0;
while((SSPSR&0x01)==0);
return;
}
/*8***********************************************************************/
void spi_send_data(unsigned char *data_pointer)
{
IOCLR=slave_cs;
SPDR=(*data_pointer);
while((S0PSR&0x80)==0); //程序运行到这里死循环
IOSET=slave_cs;
return;
}
int main(void)
{
unsigned char n=3,j;
unsigned char *p;
p=display;
PINSEL0=0x00005500; //p0.4(9:8=01)-sck0 ,p0.5(11:10=01)-miso0
//p0.6(13:12=01)-mosi0, p0.7(15:14=01)-sel0
PINSEL1=0x000002a9; //p0.16(1:0=01)-eint0,p0.17(3:2=10)-sck1,
//p0.18(5:4=10)-miso1,p0.19(7:6=10)-mosi1
//p0.20(9:8=10)-ssel1,
IO1SET=(led1|led2|led3|led4|led5|led6|led7|led8);
IO1DIR=(led1|led2|led3|led4|led5|led6|led7|led8);
ssp_initial(); //ssp初始化
spi_initial(); //isp初始化
IRQEnable();
VICIntSelect=0x00000000;
VICVectCntl0=0x20|14 ; //使能spi0,
VICVectAddr0=(uint32)read_from_spi; //设置中断服务程序地址
VICIntEnable=(1<<0x0a); //允许spi0,eint0
for(j=0;j<16;j++)
{
spi_send_data(p);
delay(n);
IO0SET=slave_cs; //片选信号拉高进入主机模式
S0PCR=(1<<5); //S0PCR 的 MSTR位置1,把spi设置为主机
if(recv_flag==0)
ssp_send_data();
delay(n);
}
return (0);
}
答 1: 有没有哪位朋友知道这个问题啊有没有哪位朋友知道这个问题啊,很急,谢谢
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |