最近在项目中需要51和ARM之间进行通信,采用的是无线模块24L01,使用的ARM开发板是6410。
开发时参考了一些2440的驱动,但是绝大多数2440的驱动好像有点小问题,以下是我自己编写的驱动,可以实现双向通信。
和2440的主要区别的代码如下:
......
/**pin configure**/
#define CE_OUT write_con(0x0f,0x01)
#define CE_UP write_pud(0x03,0x02)
#define CE_L write_dat(0x01,0)
#define CE_H write_dat(0x01,1)
#define SCK_OUT write_con(0x0f<<8,0x01<<8)
#define SCK_UP write_pud(0x03<<4,0x02<<4)
#define SCK_L write_dat(0x01<<2,0<<2)
#define SCK_H write_dat(0x01<<2,1<<2)
#define MISO_IN write_con(0x0f<<16,0x00<<16)
#define MISO_UP write_pud(0x03<<8,0x02<<8)
#define MISO_STU get_MISO()
#define IRQ_IN write_con(0x0f<<20,0x00<<20)
#define IRQ_UP write_pud(0x03<<10,0x02<<10)
#define IRQ_L write_dat(0x01<<5,0<<5)
#define IRQ_H write_dat(0x01<<5,1<<5)
#define MOSI_OUT write_con(0x0f<<12,0x01<<12)
#define MOSI_UP write_pud(0x03<<6,0x02<<6)
#define MOSI_L write_dat(0x01<<3,0<<3)
#define MOSI_H write_dat(0x01<<3,1<<3)
#define CSN_OUT write_con(0x0f<<4,0x01<<4)
#define CSN_UP write_pud(0x03<<2,0x02<<2)
#define CSN_L write_dat(0x01<<1,0<<1)
#define CSN_H write_dat(0x01<<1,1<<1)
/*pin & nrf*/
/*******************
CE-GPL0
CSN-GPL1
SCK-GPL2
MOSI-GPL3
MISO-GPL4
IRQ-GPL5
********************/
void write_con(unsigned int mask,unsigned int con)
{
unsigned int tmp;
tmp=readl(S3C64XX_GPLCON);
tmp=((tmp&(~mask))|con);
writel(tmp,S3C64XX_GPLCON);
}
void write_dat(unsigned int mask,unsigned int dat)
{
unsigned int tmp;
tmp=readl(S3C64XX_GPLDAT);
tmp=((tmp&(~mask))|dat);
writel(tmp,S3C64XX_GPLDAT);
}
void write_pud(unsigned int mask,unsigned int pud)
{
unsigned int tmp;
tmp=readl(S3C64XX_GPLPUD);
tmp=((tmp&(~mask))|pud);
writel(tmp,S3C64XX_GPLPUD);
}
unsigned int get_MISO(void)
{
unsigned int tmp=0;
tmp=readl(S3C64XX_GPLDAT);
if(tmp&(1<<4))
return 1;
else
return 0;
}
......
代码下载地址:
http://download.csdn.net/detail/u010211018/5820941
由于时间比较匆忙,格式有点不人性化,希望大家谅解。
如需转载,希望能注明出处。
非常感谢。
开发时参考了一些2440的驱动,但是绝大多数2440的驱动好像有点小问题,以下是我自己编写的驱动,可以实现双向通信。
和2440的主要区别的代码如下:
......
/**pin configure**/
#define CE_OUT write_con(0x0f,0x01)
#define CE_UP write_pud(0x03,0x02)
#define CE_L write_dat(0x01,0)
#define CE_H write_dat(0x01,1)
#define SCK_OUT write_con(0x0f<<8,0x01<<8)
#define SCK_UP write_pud(0x03<<4,0x02<<4)
#define SCK_L write_dat(0x01<<2,0<<2)
#define SCK_H write_dat(0x01<<2,1<<2)
#define MISO_IN write_con(0x0f<<16,0x00<<16)
#define MISO_UP write_pud(0x03<<8,0x02<<8)
#define MISO_STU get_MISO()
#define IRQ_IN write_con(0x0f<<20,0x00<<20)
#define IRQ_UP write_pud(0x03<<10,0x02<<10)
#define IRQ_L write_dat(0x01<<5,0<<5)
#define IRQ_H write_dat(0x01<<5,1<<5)
#define MOSI_OUT write_con(0x0f<<12,0x01<<12)
#define MOSI_UP write_pud(0x03<<6,0x02<<6)
#define MOSI_L write_dat(0x01<<3,0<<3)
#define MOSI_H write_dat(0x01<<3,1<<3)
#define CSN_OUT write_con(0x0f<<4,0x01<<4)
#define CSN_UP write_pud(0x03<<2,0x02<<2)
#define CSN_L write_dat(0x01<<1,0<<1)
#define CSN_H write_dat(0x01<<1,1<<1)
/*pin & nrf*/
/*******************
CE-GPL0
CSN-GPL1
SCK-GPL2
MOSI-GPL3
MISO-GPL4
IRQ-GPL5
********************/
void write_con(unsigned int mask,unsigned int con)
{
unsigned int tmp;
tmp=readl(S3C64XX_GPLCON);
tmp=((tmp&(~mask))|con);
writel(tmp,S3C64XX_GPLCON);
}
void write_dat(unsigned int mask,unsigned int dat)
{
unsigned int tmp;
tmp=readl(S3C64XX_GPLDAT);
tmp=((tmp&(~mask))|dat);
writel(tmp,S3C64XX_GPLDAT);
}
void write_pud(unsigned int mask,unsigned int pud)
{
unsigned int tmp;
tmp=readl(S3C64XX_GPLPUD);
tmp=((tmp&(~mask))|pud);
writel(tmp,S3C64XX_GPLPUD);
}
unsigned int get_MISO(void)
{
unsigned int tmp=0;
tmp=readl(S3C64XX_GPLDAT);
if(tmp&(1<<4))
return 1;
else
return 0;
}
......
代码下载地址:
http://download.csdn.net/detail/u010211018/5820941
由于时间比较匆忙,格式有点不人性化,希望大家谅解。
如需转载,希望能注明出处。
非常感谢。