|
楼主 |
发表于 2013-8-12 08:35:16
|
显示全部楼层
happyandsafe 发表于 2013-8-9 17:38
大哥,在吗?我也遇到了2416不出时钟的问题了?能帮我看下程序不?
//prepare Enable
*sys_MISCCR |= ...
int drv_spi_open(unsigned char mode,
unsigned char clktype,
unsigned char transtype,
unsigned int speed)
{
unsigned int pclk;
unsigned int val;
unsigned char tmp;
struct clk *clk;
DBG("mode:%d",mode);
DBG("clktype:%d",clktype);
DBG("transtype:%d",transtype);
DBG("speed:%d",speed);
/* 获取PCLK */
clk=clk_get(NULL,"pclk");
pclk=clk_get_rate(clk);
/* 根据速度计算分频值 */
pclk=(pclk/speed/2)-1;
DBG("DIV:%d",pclk);
/*=========== 1、配置SPI引脚SPI模式 CLK MISO MOSI CS========*/
HSSPI.io_reg->GPIOCON&=~(3<<26);
HSSPI.io_reg->GPIOCON|=2<<26; /* GPE13设为SPICLK */
HSSPI.io_reg->GPIOUDP&=~(3<<26); /* 禁止上拉 */
HSSPI.io_reg->GPIOCON&=~(3<<24);
HSSPI.io_reg->GPIOCON|=2<<24; /* GPE12设为SPIMOSI */
HSSPI.io_reg->GPIOUDP&=~(3<<24); /* 禁止上拉 */
HSSPI.io_reg->GPIOCON&=~(3<<22);
HSSPI.io_reg->GPIOCON|=2<<22; /* GPE11设为SPIMISO */
//HSSPI.io_reg->GPIOUDP&=~(3<<22); /* 禁止上拉 */
HSSPI.io_reg->GPIODAT&=~(7<<11); /* 清空数据寄存器 */
/* 配置SPI的CS */
HSSPI.cs_reg->GPIOCON&=~(3<<26);
HSSPI.cs_reg->GPIOCON|=2<<26; /* GPL13设为SS */
HSSPI.cs_reg->GPIOUDP&=~(3<<26); /* 禁止上拉 */
/*=========== 2、配置SPI寄存寄存器 ========*/
HSSPI.spi_reg->CH_CFG=0;
HSSPI.spi_reg->CH_CFG|=1<<5; /* SPI复位 */
udelay(5);
HSSPI.spi_reg->CH_CFG&=~(1<<5); /* 停止SPI复位 */
HSSPI.spi_reg->CH_CFG|=mode<<4; /* 设置主从模式 */
HSSPI.spi_reg->CH_CFG|=clktype<<3; /* 设置时钟模式 */
HSSPI.spi_reg->CH_CFG|=transtype<<2; /* 传输数据格式 */
HSSPI.spi_reg->CH_CFG|=0<<1; /* 关闭RX */
HSSPI.spi_reg->CH_CFG|=0<<0; /* 关闭TX */
/*=========== 3、配置SPI时钟 ========*/
HSSPI.spi_reg->CLK_CFG=0;
HSSPI.spi_reg->CLK_CFG|=0<<8; /* 开启时钟 */
HSSPI.spi_reg->CLK_CFG|=0<<9; /* 选择PCLK做时钟源 */
HSSPI.spi_reg->CLK_CFG|=pclk<<0; /* 配置时钟 */
/*=========== 4、配置SPI传输数据宽度与中断触发等级 ========*/
HSSPI.spi_reg->MODE_CFG=0;
HSSPI.spi_reg->MODE_CFG|=0<<29; /* 传输单位为字节 */
HSSPI.spi_reg->MODE_CFG|=0<<17; /* 总线宽度为字节 */
HSSPI.spi_reg->MODE_CFG|=1<<11; /* 接收中断触发字节为1字节 */
HSSPI.spi_reg->MODE_CFG|=1<<5; /* 发送中断触发字节为1字节 */
/*=========== 5、配置SPI中断使能 ========*/
HSSPI.spi_reg->HS_SPI_INT_EN=1<<1;
/*=========== 6、配置交换字节 ========*/
//HSSPI.spi_reg->SWAP_CFG=(1<<5)|(1<<1);
/*=========== 7、配置SPI使能模式 ========*/
HSSPI.spi_reg->SLAVE_SEL_REG=0x01; /* 设置为手动设置并关闭SS */
/*=========== 8、申请接收缓存 ========*/
HSSPI.rxfifo.pbuf=kmalloc(256,GFP_KERNEL); /* 申请接收内存 */
if(HSSPI.rxfifo.pbuf==NULL)
{
return HSSPI_ERR;
}
HSSPI.rxfifo.size = 256;
HSSPI.rxfifo.write = 0;
HSSPI.rxfifo.read = 0;
/*=========== 9、安装SPI接收中断 ========*/
HSSPI.irq_rx=S3C2416_IRQ_HSSPI;
HSSPI.handler=drv_spi_irq;
HSSPI.irq_rx_st=request_irq(HSSPI.irq_rx,HSSPI.handler,IRQF_SHARED|IRQF_DISABLED,"dev_spi",(void*)1);
if(HSSPI.irq_rx_st!=0)
{
DBG("request SPI IRQ RX fail!");
return HSSPI_ERR;
}
/*=========== 10、开启接收/发送端口 =========*/
drv_spi_TxRxON();
/*=========== 11、使能SPI =========*/
drv_spi_enable();
return 0 ;
}
void drv_spi_TxRxOFF(void)
{
HSSPI.spi_reg->CH_CFG&=~0x03;
} |
|