mini2440的spi驱动问题,数据能正常接收和发送,但是spi的redy位不能自动清0,主要寄存器设置如下:
在open()函数中
r_clkcon |= 0x40000;
spi_gpgcon &=0xFFFFFFCF;//GPGCON-2=11
spi_gpgcon |=0x00000030;
value=(int)spi_gpgcon;
printk("spi_gpgcon=0x%x\n",value);
spi_gpgup &= 0xFFFB;//GPGUP-2=1
spi_gpgup |=0x0004;
value=(int)spi_gpgup;
printk("spi_gpgup=0x%x\n",value);
spi_gpecon &=0xF03FFFFF;//GPECON-11,12,13=10
spi_gpecon |=0x0A800000;
value=(int)spi_gpecon;
printk("spi_gpecon=0x%x\n",value);
spi_gpeup &=0xC7FF;//GPEUP-13=1 GPGUP-12,11=0
spi_gpeup |=0x2000;
value=(int)spi_gpeup;
printk("spi_gpeup=0x%x\n",value);
printk("config SPI...\n");
config=(int)spi_spcon0;
printk("spi_spcon0=0x%x\n",config);
spi_sppin0=(0<<2)|(0<<1)|(0<<0);
config=(int)spi_sppin0;
printk("spi_sppin0=0x%x\n",config);
spi_sppre0=0xFF;//SPI Baud Rate Prescaler Register,Baud Rate=PCLK/2/(Prescaler value+1);
下面是write()
static ssize_t s3c2440_spi_write(struct file *filp,const char __user *buf,size_t count,loff_t *f_ops)
{
int spcon;
char i=0;
copy_from_user(dataTx,buf,sizeof(dataTx));
spi_spcon0=(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(0<<1)|(0<<0);
for(i=0;i<10;i++)
{
spi_sptdat0=0xff;
}
if((spi_spsta0&0x01)==1) //data Tx/Rx ready
{
spi_sptdat0=dataTx[0];
spcon=(int)spi_spsta0;
printk("spi_spsta%d\n",spcon);//这里打印出来是1
printk("txt char=%d\n",dataTx[0];
printk("txt char=%c\n",dataTx[0]);
spcon=(int)spi_sptdat0;
printk("spi_sptdat0=%d\n",spcon);
}
udelay(10);
if((spi_spsta0&0x01)==1) //data Tx/Rx ready
{
printk("txt char=%d\n",dataRx[0]);
dataRx[0]=spi_sprdat0;
spcon=(int)spi_spsta0;
printk("spi_spsta%d\n",spcon);//the first sta
printk("txt char=%d\n",dataRx[0]);
printk("txt char=%c\n",dataRx[0]);
spcon=(int)spi_sptdat0;
printk("spi_sptdat0=%d\n",spcon);
}
spcon=(int)spi_spcon0;
printk("spi_spcon=0x%x\n",spcon);
spcon=(int)spi_spsta0;
printk("spi_spsta%d\n",spcon);//the first sta
spi_spcon0=(0<<6)|(0<<5)|(0<<4)|(1<<3)|(0<<2)|(0<<1)|(0<<0);
//spi_spcon0=0x00; //Polling,dis-sck,master,low,format A,nomal
// udelay(10);
return 0;
}
请高手指点一下