小弟出现这个问题已经很久了,一直都没有解决还请各位高手帮我一下。<br />#include "RF.h"<br />short unsigned int txbuff[158];<br />short unsigned int rxbuff[5]={0xf802,0xf810,0xf806,0xf80c,0xf838};<br />short unsigned int dsbuff[2]={0xf880,0xfa31};<br /><br />int main(void)<br />{//初始化DB<br /> uint i=0,k=0;<br />short unsigned int *index;<br />unsigned int *in;<br />unsigned int rxb[1];<br /> for(;i<=78;i++)<br /> {<br /> txbuff=0xf880+((i/2));<br /> ++i;<br /> txbuff=0xfa20;<br /> }<br /> for(i=79;i<=158;i++)<br /> {<br /> txbuff=0xf8c0+(((i-79)/2));<br /> ++i;<br /> txbuff=0xfa20;<br /> }<br /> AT91F_DBGU_CfgPIO();//DBGU管脚分配<br /> //AT91C_BASE_PMC->PMC_PCER = 0x000000C0;<br /> *AT91C_CKGR_MOR=0x701; //使能主振荡器和设置起振时间<br /> *AT91C_PMC_SCER=AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理时钟<br /> *AT91C_PMC_PCER=(1<<AT91C_ID_PIOA)|(1<<AT91C_ID_SPI)|(1<<AT91C_ID_US0);<br /> AT91C_BASE_DBGU->DBGU_BRGR =0x00000001;<br /> AT91F_US_Configure((AT91PS_USART)AT91C_BASE_DBGU,main_clock,AT91C_US_ASYNC_MODE,baud_rate,time_guard); *AT91C_US0_CR=0x1ac;<br /> *AT91C_US0_MR=0x8c0; <br /> *AT91C_US0_BRGR=30;<br /> *AT91C_US0_CR=0x50; //初始化串口0, <br /> AT91F_US_EnableTx((AT91PS_USART)AT91C_BASE_DBGU);<br /> AT91F_US_EnableRx((AT91PS_USART)AT91C_BASE_DBGU);<br /> AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,"serior 0 is ok
");<br />//以上都是串口设置作为调试用的<br /><br /><br />*AT91C_PIOA_PDR=(AT91C_PA12_MISO|AT91C_PA13_MOSI|AT91C_PA14_SPCK|AT91C_PA11_NPCS0|US_RXD_PIN|US_TXD_PIN);<br /><br />*AT91C_PIOA_ASR=(AT91C_PA12_MISO|AT91C_PA13_MOSI|AT91C_PA14_SPCK|AT91C_PA11_NPCS0|US_RXD_PIN|US_TXD_PIN);<br /><br /><br /><br />*AT91C_SPI_CR=AT91C_SPI_SPIEN|AT91C_SPI_LASTXFER;<br />*AT91C_SPI_IDR=0x3ff;<br />*AT91C_SPI_MR=(AT91C_SPI_MSTR|AT91C_SPI_PS_FIXED|0xe<<16|AT91C_SPI_FDIV|(127<<24)|AT91C_SPI_MODFDIS);<br />//主机模式,不分频,固定片选0,禁止错误检测<br />*AT91C_SPI_CSR=(AT91C_SPI_NCPHA|AT91C_SPI_BITS_16|(255<<8)|AT91C_SPI_DLYBS|AT91C_SPI_DLYBCT);<br />//16位数据,传输完成后片选保持,48M/12分频,传输前延时255,连续传输延时255 <br />*AT91C_SPI_PTCR=AT91C_PDC_TXTEN|AT91C_PDC_RXTEN;//使能PDC方式<br /><br /> index=&txbuff[0];//给地址<br /> in=&rxb[0];<br /> for(k=0;k<158;k++)<br /> {<br /> *AT91C_SPI_TPR=(unsigned int)(index);<br /> *AT91C_SPI_TCR = 1;<br /> *AT91C_SPI_RPR = (unsigned int)in; <br /> *AT91C_SPI_RCR = 1;<br /> index++;<br /> while(!((*AT91C_SPI_SR)&0x00000030));//判断发送是否成功<br /> *AT91C_SPI_CR |= AT91C_SPI_LASTXFER;;//片选置高<br /> }//将TX全发送出去<br /> AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,"ok1");<br />index=&rxbuff[0];<br /> for(k=0;k<5;k++)<br /> {<br /> *AT91C_SPI_TPR=(unsigned int)(index);<br /> *AT91C_SPI_TCR=1;<br /> *AT91C_SPI_RPR = (unsigned int)in; <br /> *AT91C_SPI_RCR = 1;<br /> index++;<br /> while(!((*AT91C_SPI_SR)&0x00000030));<br /> *AT91C_SPI_CR |= AT91C_SPI_LASTXFER;;//片选置高<br /> }//将RX全发送出去<br /> AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,"ok2");<br /> index=&dsbuff[0];<br /> for(k=0;k<2;k++)<br /> {<br /> *AT91C_SPI_TPR=(unsigned int)(index);<br /> *AT91C_SPI_TCR=1;<br /> *AT91C_SPI_RPR = (unsigned int)in; <br /> *AT91C_SPI_RCR = 1;<br /> index++;<br /> while(!((*AT91C_SPI_SR)&0x00000030));<br /> *AT91C_SPI_CR |= AT91C_SPI_LASTXFER;//片选置高<br /> }//将DS全发送出去<br /> AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,"ok3");<br /> while(1);<br />}<br /><br />这是我用PDC方式写的程序,没有成功,但是我不用PDC方式,直接用SPI却可以<br /><br />int main(void)<br />{//初始化DB<br /><br /> uint i=0x80;<br /> AT91F_DBGU_CfgPIO();<br /><br /> *AT91C_CKGR_MOR=0x701; //使能主振荡器和设置起振时间<br /> *AT91C_PMC_SCER=AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理时钟<br /> *AT91C_PMC_PCER=(1<<AT91C_ID_PIOA)|(1<<AT91C_ID_SPI);<br /> AT91C_BASE_DBGU->DBGU_BRGR =0x00000001;<br /> AT91F_US_Configure((AT91PS_USART)AT91C_BASE_DBGU,main_clock,AT91C_US_ASYNC_MODE,baud_rate,time_guard); //初始化串口0, <br /> AT91F_US_EnableTx((AT91PS_USART)AT91C_BASE_DBGU);<br /> AT91F_US_EnableRx((AT91PS_USART)AT91C_BASE_DBGU);<br /> AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,"serior 0 is ok
");<br />//以上都是初始化串口做调试之用<br /><br /><br />*AT91C_PIOA_PDR=(AT91C_PA12_MISO|AT91C_PA13_MOSI|AT91C_PA14_SPCK|AT91C_PA11_NPCS0);<br />//PIO使能引脚的外设功能<br />*AT91C_PIOA_ASR=(AT91C_PA12_MISO|AT91C_PA13_MOSI|AT91C_PA14_SPCK|AT91C_PA11_NPCS0);<br />//外设A分配给SPI外设A功能<br />*AT91C_SPI_CR=AT91C_SPI_SPIEN|AT91C_SPI_LASTXFER;<br />*AT91C_SPI_IDR=0x3ff;//允许SPI口<br />*AT91C_SPI_MR=(AT91C_SPI_MSTR|AT91C_SPI_PS_FIXED|0xe<<16|AT91C_SPI_FDIV|(127<<24)||AT91C_SPI_MODFDIS);<br />//主机模式,不分频,固定片选0,禁止错误检测<br />*AT91C_SPI_CSR=(AT91C_SPI_NCPHA|AT91C_SPI_BITS_16|(255<<8)|AT91C_SPI_DLYBS|AT91C_SPI_DLYBCT);<br />//16位数据,传输完成后片选保持,48M/12分频,传输前延时255,连续传输延时255 <br /> <br /> intdisplay1(); <br /> while(1)<br /> { <br /> send1(0xf880);<br /> send1(0xfa32);<br /> AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,"ok000");<br /> while(1);<br /> } <br />}<br />void send1(uint dat)<br />{int a;<br /> while((*AT91C_SPI_SR&AT91C_SPI_TDRE)==0); <br /> *AT91C_SPI_TDR=dat&0xffff;<br /> while((*AT91C_SPI_SR&AT91C_SPI_TDRE)==0) {;} //等待数据发送完成 <br /> AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,"0 is ok
");<br /> a=*AT91C_SPI_RDR;<br /> *AT91C_SPI_CR |= AT91C_SPI_LASTXFER;<br />}<br />void intdisplay1(void)<br />{<br /> uint i=0xf880,j=0xf8c0;<br /> for(;i<=0xf8a7;i++)<br /> {<br /> send1(i);<br /> AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,"ok2");<br /> send1(0xfa20);<br /> AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,"ok4");<br /><br /> } <br /><br /> for(;j<=0xf8e7;j++)<br /> {<br /> send1(j);<br /> AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,"ok5");<br /> send1(0xfa20);<br /> AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,"ok7");<br /> <br /> }<br /> send1(0xf802);//将光标设置到DDRAM的00H地址<br /> send1(0xf810);<br /> send1(0xf806);//输入模式设置,计数器的增加随DDRAM,移动禁止<br /> send1(0xf80c);//显示关,光标关,闪烁关。<br /> send1(0xf838);//显示设置2层,设置亮度大小100%<br />}<br />同样的两个程序,只是用不用PDC的区别,但是我的LED在没有用PDC方式下显示出了想要的结果,而前个程序用PDC方式却没有出来结果,但是根据串口显示结果数据好象是发出去了。请各位帮个忙,这个困扰我好久了谢谢了,我用的芯片是at91sam7s128 |
|