关于LPC2366用ads调试ssp的spi模式(用中断的方式)
时间:10-02
整理:3721RD
点击:
周立功给的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);
}
..程序太长被打乱了。求帮助呀= =