关于ARM7中PDC方式的问题

[复制链接]
3010|0
 楼主| chen1018 发表于 2008-5-8 19:12 | 显示全部楼层 |阅读模式
小弟出现这个问题已经很久了,一直都没有解决还请各位高手帮我一下。<br />#include&nbsp;&quot;RF.h&quot;<br />short&nbsp;unsigned&nbsp;int&nbsp;txbuff[158];<br />short&nbsp;unsigned&nbsp;int&nbsp;rxbuff[5]={0xf802,0xf810,0xf806,0xf80c,0xf838};<br />short&nbsp;unsigned&nbsp;int&nbsp;dsbuff[2]={0xf880,0xfa31};<br /><br />int&nbsp;main(void)<br />{//初始化DB<br />&nbsp;uint&nbsp;i=0,k=0;<br />short&nbsp;unsigned&nbsp;int&nbsp;*index;<br />unsigned&nbsp;int&nbsp;*in;<br />unsigned&nbsp;int&nbsp;rxb[1];<br />&nbsp;for(;i&lt=78;i++)<br />&nbsp;{<br />&nbsp;&nbsp;txbuff=0xf880+((i/2));<br />&nbsp;&nbsp;++i;<br />&nbsp;&nbsp;txbuff=0xfa20;<br />&nbsp;}<br />&nbsp;for(i=79;i&lt=158;i++)<br />&nbsp;{<br />&nbsp;&nbsp;txbuff=0xf8c0+(((i-79)/2));<br />&nbsp;&nbsp;++i;<br />&nbsp;&nbsp;txbuff=0xfa20;<br />&nbsp;}<br />&nbsp;AT91F_DBGU_CfgPIO();//DBGU管脚分配<br />&nbsp;//AT91C_BASE_PMC-&gtPMC_PCER&nbsp;=&nbsp;0x000000C0;<br />&nbsp;&nbsp;*AT91C_CKGR_MOR=0x701;&nbsp;&nbsp;&nbsp;//使能主振荡器和设置起振时间<br />&nbsp;*AT91C_PMC_SCER=AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理时钟<br />&nbsp;*AT91C_PMC_PCER=(1&lt&ltAT91C_ID_PIOA)|(1&lt&ltAT91C_ID_SPI)|(1&lt&ltAT91C_ID_US0);<br />&nbsp;&nbsp;AT91C_BASE_DBGU-&gtDBGU_BRGR&nbsp;=0x00000001;<br />&nbsp;AT91F_US_Configure((AT91PS_USART)AT91C_BASE_DBGU,main_clock,AT91C_US_ASYNC_MODE,baud_rate,time_guard);&nbsp;&nbsp;&nbsp;*AT91C_US0_CR=0x1ac;<br />&nbsp;&nbsp;&nbsp;*AT91C_US0_MR=0x8c0;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;*AT91C_US0_BRGR=30;<br />&nbsp;&nbsp;&nbsp;*AT91C_US0_CR=0x50;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化串口0,&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;AT91F_US_EnableTx((AT91PS_USART)AT91C_BASE_DBGU);<br />&nbsp;AT91F_US_EnableRx((AT91PS_USART)AT91C_BASE_DBGU);<br />&nbsp;AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,&quot;serior&nbsp;0&nbsp;is&nbsp;ok
&quot;);<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&lt&lt16|AT91C_SPI_FDIV|(127&lt&lt24)|AT91C_SPI_MODFDIS);<br />//主机模式,不分频,固定片选0,禁止错误检测<br />*AT91C_SPI_CSR=(AT91C_SPI_NCPHA|AT91C_SPI_BITS_16|(255&lt&lt8)|AT91C_SPI_DLYBS|AT91C_SPI_DLYBCT);<br />//16位数据,传输完成后片选保持,48M/12分频,传输前延时255,连续传输延时255&nbsp;<br />*AT91C_SPI_PTCR=AT91C_PDC_TXTEN|AT91C_PDC_RXTEN;//使能PDC方式<br /><br />&nbsp;&nbsp;&nbsp;index=&txbuff[0];//给地址<br />&nbsp;&nbsp;&nbsp;in=&rxb[0];<br />&nbsp;for(k=0;k&lt158;k++)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_TPR=(unsigned&nbsp;int)(index);<br />&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_TCR&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_RPR&nbsp;=&nbsp;(unsigned&nbsp;int)in;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_RCR&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;index++;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(!((*AT91C_SPI_SR)&0x00000030));//判断发送是否成功<br />&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_CR&nbsp;|=&nbsp;AT91C_SPI_LASTXFER;;//片选置高<br />&nbsp;&nbsp;}//将TX全发送出去<br />&nbsp;&nbsp;&nbsp;AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,&quot;ok1&quot;);<br />index=&rxbuff[0];<br />&nbsp;for(k=0;k&lt5;k++)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_TPR=(unsigned&nbsp;int)(index);<br />&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_TCR=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_RPR&nbsp;=&nbsp;(unsigned&nbsp;int)in;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_RCR&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;index++;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(!((*AT91C_SPI_SR)&0x00000030));<br />&nbsp;&nbsp;*AT91C_SPI_CR&nbsp;|=&nbsp;AT91C_SPI_LASTXFER;;//片选置高<br />&nbsp;&nbsp;}//将RX全发送出去<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,&quot;ok2&quot;);<br />&nbsp;index=&dsbuff[0];<br />&nbsp;for(k=0;k&lt2;k++)<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_TPR=(unsigned&nbsp;int)(index);<br />&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_TCR=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_RPR&nbsp;=&nbsp;(unsigned&nbsp;int)in;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*AT91C_SPI_RCR&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;index++;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(!((*AT91C_SPI_SR)&0x00000030));<br />&nbsp;*AT91C_SPI_CR&nbsp;|=&nbsp;AT91C_SPI_LASTXFER;//片选置高<br />&nbsp;}//将DS全发送出去<br />&nbsp;&nbsp;&nbsp;&nbsp;AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,&quot;ok3&quot;);<br />&nbsp;while(1);<br />}<br /><br />这是我用PDC方式写的程序,没有成功,但是我不用PDC方式,直接用SPI却可以<br /><br />int&nbsp;main(void)<br />{//初始化DB<br /><br />&nbsp;uint&nbsp;i=0x80;<br />&nbsp;AT91F_DBGU_CfgPIO();<br /><br />&nbsp;&nbsp;*AT91C_CKGR_MOR=0x701;&nbsp;&nbsp;&nbsp;//使能主振荡器和设置起振时间<br />&nbsp;*AT91C_PMC_SCER=AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理时钟<br />&nbsp;*AT91C_PMC_PCER=(1&lt&ltAT91C_ID_PIOA)|(1&lt&ltAT91C_ID_SPI);<br />&nbsp;&nbsp;AT91C_BASE_DBGU-&gtDBGU_BRGR&nbsp;=0x00000001;<br />&nbsp;AT91F_US_Configure((AT91PS_USART)AT91C_BASE_DBGU,main_clock,AT91C_US_ASYNC_MODE,baud_rate,time_guard);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化串口0,&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;AT91F_US_EnableTx((AT91PS_USART)AT91C_BASE_DBGU);<br />&nbsp;AT91F_US_EnableRx((AT91PS_USART)AT91C_BASE_DBGU);<br />&nbsp;AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,&quot;serior&nbsp;0&nbsp;is&nbsp;ok
&quot;);<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&lt&lt16|AT91C_SPI_FDIV|(127&lt&lt24)||AT91C_SPI_MODFDIS);<br />//主机模式,不分频,固定片选0,禁止错误检测<br />*AT91C_SPI_CSR=(AT91C_SPI_NCPHA|AT91C_SPI_BITS_16|(255&lt&lt8)|AT91C_SPI_DLYBS|AT91C_SPI_DLYBCT);<br />//16位数据,传输完成后片选保持,48M/12分频,传输前延时255,连续传输延时255&nbsp;<br />&nbsp;<br />&nbsp;intdisplay1();&nbsp;&nbsp;&nbsp;<br />&nbsp;while(1)<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;send1(0xf880);<br />&nbsp;&nbsp;&nbsp;&nbsp;send1(0xfa32);<br />&nbsp;&nbsp;&nbsp;&nbsp;AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,&quot;ok000&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;}&nbsp;<br />}<br />void&nbsp;send1(uint&nbsp;dat)<br />{int&nbsp;a;<br />&nbsp;while((*AT91C_SPI_SR&AT91C_SPI_TDRE)==0);&nbsp;&nbsp;<br />&nbsp;*AT91C_SPI_TDR=dat&0xffff;<br />&nbsp;while((*AT91C_SPI_SR&AT91C_SPI_TDRE)==0)&nbsp;{;}&nbsp;&nbsp;&nbsp;//等待数据发送完成&nbsp;&nbsp;&nbsp;<br />&nbsp;AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,&quot;0&nbsp;is&nbsp;ok
&quot;);<br />&nbsp;&nbsp;a=*AT91C_SPI_RDR;<br />&nbsp;&nbsp;*AT91C_SPI_CR&nbsp;|=&nbsp;AT91C_SPI_LASTXFER;<br />}<br />void&nbsp;intdisplay1(void)<br />{<br />&nbsp;uint&nbsp;i=0xf880,j=0xf8c0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(;i&lt=0xf8a7;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send1(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,&quot;ok2&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send1(0xfa20);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,&quot;ok4&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br /><br />&nbsp;for(;j&lt=0xf8e7;j++)<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send1(j);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,&quot;ok5&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;send1(0xfa20);<br />&nbsp;&nbsp;&nbsp;&nbsp;AT91F_Printk((AT91PS_USART)AT91C_BASE_DBGU,&quot;ok7&quot;);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;}<br />&nbsp;send1(0xf802);//将光标设置到DDRAM的00H地址<br />&nbsp;send1(0xf810);<br />&nbsp;send1(0xf806);//输入模式设置,计数器的增加随DDRAM,移动禁止<br />&nbsp;send1(0xf80c);//显示关,光标关,闪烁关。<br />&nbsp;send1(0xf838);//显示设置2层,设置亮度大小100%<br />}<br />同样的两个程序,只是用不用PDC的区别,但是我的LED在没有用PDC方式下显示出了想要的结果,而前个程序用PDC方式却没有出来结果,但是根据串口显示结果数据好象是发出去了。请各位帮个忙,这个困扰我好久了谢谢了,我用的芯片是at91sam7s128
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

14

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部