IIC驱动写数据异常
ARM9 2440.
裸机下的IIC驱动已经调试成功,现在需要以linux字符型驱动的形式实现,按照逻辑下调通的逻辑,只是用了一些内核读写寄存器的函数。
写数据时,用示波器观察波形,观察到会重复发送某个数据,或者是SDA线上的数据不是我往IICDS中写的数据。每一个IIC通信周期的第九时钟SD线都为低,处理器收到ACK。
为什么会出现这种情况呢?大家帮我看看我的写代码:
regIICCON =ioremap(0x54000000,4);
regIICSTAT=ioremap(0x54000004,4);
regIICADD =ioremap(0x54000008,4);
regIICDS =ioremap(0x5400000c,4);
//设置GPE15->IICSDA和GPE14->IICSCL
s3c2410_gpio_cfgpin(S3C2410_GPE15, S3C2410_GPE15_IICSDA);
s3c2410_gpio_cfgpin(S3C2410_GPE14, S3C2410_GPE14_IICSCL);
i2c_clock= clk_get(NULL, "i2c");
if (!i2c_clock)
{
printk(KERN_ERR "failed to get i2c clock source\n");
return -ENOENT;
}
clk_enable(i2c_clock);
//Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit clock value Tx clock=IICCLK/16
iowrite8(0xaf,regIICCON);//250kHz
//写slave设备地址
iowrite8(SAD_W,regIICDS);
iowrite8(0xf0,regIICSTAT);
while(!(ioread8(regIICCON)&S3C2410_IICCON_IRQPEND));
//写slave设备寄存器地址
iowrite8(0x80|addr,regIICDS);
iowrite8(ioread8(regIICCON)&(~S3C2410_IICCON_IRQPEND),regIICCON);
while(!(ioread8(regIICCON)&S3C2410_IICCON_IRQPEND));
//写数据
iowrite8(0x03,regIICDS);
iowrite8(ioread8(regIICCON)&(~S3C2410_IICCON_IRQPEND),regIICCON);
while(!(ioread8(regIICCON)&S3C2410_IICCON_IRQPEND));
//完成一次写操作,发stop信号
iowrite8(0xd0,regIICSTAT);
iowrite8(ioread8(regIICCON)&(~S3C2410_IICCON_IRQPEND),regIICCON);
udelay(10);