- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
关于LPC2366用ads调试ssp的spi模式(用中断的方式)
录入:edatop.com 点击:
周立功给的spi传输,用的查询方式,如下:uint8 SPI_RW_Byte(uint8 data)
{
uint8 back;
while ( (SSP1SR & 0x02) == 0 ); // 发送FIFO未满时跳出循环
SSP1DR = (uint16)data ; // ADE7878读命令
while ((SSP1SR & 0x10) == 0x10); // 接受FIFO不为空时跳出循环
back = SSP1DR; // 将数据寄存器中数据读出
return back;
}
由于传输数据量较大,想用ssp的中断方式进行传输,而ssp的中断就四种中断,我想用第三种,即接受FIFO一半为满时,
相应位中断使能会有产生中断,然后再编写中断服务子程序完成数据的读出,可是不知道我编完程序后,进步去中断服
务子程序,关于IRQ的已经使能了(总程序里还有一个Timer1中断,程序能进入服务子程序),下面附部分需要设置的
相关程序,求帮忙,毕设迫在眉睫。
VICVectPri8 = 8; // 3 // 设置SSPI1中断高优先级
VICVectAddr8 = (uint32)IRQ_SSP1; // 设置中断服务程序地址
VICIntEnable = 1 << 11; // 使能SSP1器1中断
void __irq IRQ_SSP1(void)
{
BEEPON();
SPI1rcvdata1=SSP1DR;
SPI1rcvdata2=SSP1DR;
SPI1rcvdata3=SSP1DR;
SPI1rcvdata4=SSP1DR;
// VICSoftIntClr = 0x000008000;
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
void SPI_R32Byte(void)
{
while((SSP1RIS & 0x04)== 0);//判断Rx FIFO是否有一半为满
SSP1IMSC=0x04; //当满足中断条件时,使能中断
}
void SPI_W8Byte(uint8 data)
{
while ( (SSP1SR & 0x02) == 0 ); // 发送FIFO未满时跳出循环
SSP1DR = (uint16)data; // ADE7878读命令
}
uint32 Read_ADE7878(uint16 add)
{
uint32 outdata;
static uint32 temp;
uint8 add_h, add_l;
add_h = (uint8)(add>>8);
add_l = (uint8)(add&0x00FF);
SS_1;
// SPI_Delay(20);
SS_0;
SPI_W8Byte(0x01); // 读命令
SPI_W8Byte(add_h); // ADE7878寄存器高地址
SPI_W8Byte(add_l); // ADE7878寄存器低地址
SPI_R32Byte();
// 读出ADE7878寄存器中高8位数据
temp = SPI1rcvdata1;
outdata = (temp<<24);
temp = SPI1rcvdata2; // 读出ADE7878寄存器中次高8位数据
outdata += (temp<<16);
temp = SPI1rcvdata3; // 读出ADE7878寄存器中低8位数据
outdata += (temp<<8);
temp = SPI1rcvdata4; // 读出ADE7878寄存器中最低8位数据
outdata += (temp<<0);
SS_1;
return (outdata);
}
{
uint8 back;
while ( (SSP1SR & 0x02) == 0 ); // 发送FIFO未满时跳出循环
SSP1DR = (uint16)data ; // ADE7878读命令
while ((SSP1SR & 0x10) == 0x10); // 接受FIFO不为空时跳出循环
back = SSP1DR; // 将数据寄存器中数据读出
return back;
}
由于传输数据量较大,想用ssp的中断方式进行传输,而ssp的中断就四种中断,我想用第三种,即接受FIFO一半为满时,
相应位中断使能会有产生中断,然后再编写中断服务子程序完成数据的读出,可是不知道我编完程序后,进步去中断服
务子程序,关于IRQ的已经使能了(总程序里还有一个Timer1中断,程序能进入服务子程序),下面附部分需要设置的
相关程序,求帮忙,毕设迫在眉睫。
VICVectPri8 = 8; // 3 // 设置SSPI1中断高优先级
VICVectAddr8 = (uint32)IRQ_SSP1; // 设置中断服务程序地址
VICIntEnable = 1 << 11; // 使能SSP1器1中断
void __irq IRQ_SSP1(void)
{
BEEPON();
SPI1rcvdata1=SSP1DR;
SPI1rcvdata2=SSP1DR;
SPI1rcvdata3=SSP1DR;
SPI1rcvdata4=SSP1DR;
// VICSoftIntClr = 0x000008000;
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
void SPI_R32Byte(void)
{
while((SSP1RIS & 0x04)== 0);//判断Rx FIFO是否有一半为满
SSP1IMSC=0x04; //当满足中断条件时,使能中断
}
void SPI_W8Byte(uint8 data)
{
while ( (SSP1SR & 0x02) == 0 ); // 发送FIFO未满时跳出循环
SSP1DR = (uint16)data; // ADE7878读命令
}
uint32 Read_ADE7878(uint16 add)
{
uint32 outdata;
static uint32 temp;
uint8 add_h, add_l;
add_h = (uint8)(add>>8);
add_l = (uint8)(add&0x00FF);
SS_1;
// SPI_Delay(20);
SS_0;
SPI_W8Byte(0x01); // 读命令
SPI_W8Byte(add_h); // ADE7878寄存器高地址
SPI_W8Byte(add_l); // ADE7878寄存器低地址
SPI_R32Byte();
// 读出ADE7878寄存器中高8位数据
temp = SPI1rcvdata1;
outdata = (temp<<24);
temp = SPI1rcvdata2; // 读出ADE7878寄存器中次高8位数据
outdata += (temp<<16);
temp = SPI1rcvdata3; // 读出ADE7878寄存器中低8位数据
outdata += (temp<<8);
temp = SPI1rcvdata4; // 读出ADE7878寄存器中最低8位数据
outdata += (temp<<0);
SS_1;
return (outdata);
}
..程序太长被打乱了。求帮助呀= =
申明:网友回复良莠不齐,仅供参考。如需专业帮助,请学习易迪拓培训专家讲授的ADS视频培训课程。
上一篇:请教ADS中版图仿真的问题
下一篇:在ADS里哪里有差分bjt管
ADS培训课程推荐详情>>
国内最全面、最专业的Agilent ADS培训课程,可以帮助您从零开始,全面系统学习ADS设计应用【More..】
- Agilent ADS教学培训课程套装
- 两周学会ADS2011、ADS2013视频教程
- ADS2012、ADS2013射频电路设计详解
- ADS高低阻抗线微带滤波器设计培训教程
- ADS混频器仿真分析实例视频培训课程
- ADS Momentum电磁仿真设计视频课程
- ADS射频电路与通信系统设计高级培训
- ADS Layout和电磁仿真设计培训视频
- ADS Workspace and Simulators Training Course
- ADS Circuit Simulation Training Course
- ADS Layout and EM Simulation Training Course
- Agilent ADS 内部原版培训教材合集