IIC调试中寄存器映射的问题

本文介绍了一个IIC调试过程中遇到的寄存器写入值与实际读取值不符的问题及其解决方法。问题源于地址映射不正确,在应用层使用正确的物理地址映射后,寄存器操作恢复正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出现的问题:

      在IIC调试中,改好驱动后,发现寄存器写入的值和我用寄存器查看助手读出的值不一样,而且是所有的IIC的寄存器写入的值和读出的值都不一样,驱动调试陷入停顿。

 

问题的原因:

      操作寄存器不对,问题的原因在于地址映射不对,但是我查了地址映射的方法和方式和其他的寄存器映射没有差别

 

解决问题:

      在S2440.H中查看寄存器定义时发现:

 #define IIC_BASE        0xB1400000 // 54000000

#define IICFIF_PHYS     0x54000000  // physical address of IIC

typedef struct {
        unsigned int    rIICCON;
        unsigned int    rIICSTAT;
        unsigned int    rIICADD;
        unsigned int    rIICDS;
 unsigned int    rIICLC;
}IICreg;

当然,以前的寄存器映射都是映射#define IIC_BASE        0xB1400000 // 54000000这个地址

VirtualCopy((PVOID)v_pIICPregs, (PVOID)(IIC_BASE>> 8), sizeof(IICreg), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)

在IIC驱动调试中也映射的这个地址时,底层寄存器在修改时没有发生变化,证明我映射的地方错了或者是映射的方式错了

#define IICFIF_PHYS     0x54000000  // physical address of IIC

VirtualCopy((PVOID)v_pIICPregs, (PVOID)(IICFIF_PHYS >> 8), sizeof(IICreg), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE) 

这个地址做映射试了一下,发现居然寄存器操作成功。

 

分析问题:

     WINCE地址映射分了两步:

第一步:是在BOOTLOADE里做第一次映射,将0xB1400000的地址映射到0x54000000

第二步:在应用层中,使用VirtualCopy((PVOID)v_pIICPregs, (PVOID)(IIC_BASE>> 8), sizeof(IICreg), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)将地址映射一次,用户便能操作寄存器。

此次出现的问题在于IIC中,第一步没有做,也就是说BOOTLOADE没有将0xB1400000的地址映射到0x54000000,后面第二步我直接在应用层映射0x54000000显然是不行的。

那么我在应用层将0xB1400000做映射解决了这个问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值