Zynq7000 I2C don';不工作,但寄存器设置正确

Zynq7000 I2C don';不工作,但寄存器设置正确,c,i2c,zynq,C,I2c,Zynq,我正试图写一段代码,通过我的Zynq7020设备上的I2C发送数据。有11个寄存器与I2C相关,我很确定,我已经正确设置了它。我还仔细检查了与CPU_1X时钟启用a和I2C复位相关的寄存器,但它们在默认情况下设置正确。当我用下面的代码设置所有数据时,状态寄存器始终为0x00000040,中断状态寄存器始终为0x00000000。我想,一定有一些启用寄存器,但我在数据表中找不到任何内容。谢谢你的回复 //I2C registers #define XIICPS_CR 0xE0

我正试图写一段代码,通过我的Zynq7020设备上的I2C发送数据。有11个寄存器与I2C相关,我很确定,我已经正确设置了它。我还仔细检查了与CPU_1X时钟启用a和I2C复位相关的寄存器,但它们在默认情况下设置正确。当我用下面的代码设置所有数据时,状态寄存器始终为0x00000040,中断状态寄存器始终为0x00000000。我想,一定有一些启用寄存器,但我在数据表中找不到任何内容。谢谢你的回复

//I2C registers 
#define XIICPS_CR           0xE0004000 //Controll register
#define XIICPS_SR           0xE0004004 //Status register
#define XIICPS_ADDR         0xE0004008 //IIC Address register
#define XIICPS_DATA         0xE000400C //IIC data register
#define XIICPS_ISR          0xE0004010 //IIC interrupt status register
#define XIICPS_TRANS_SIZE   0xE0004014 //Transfer Size Register
#define XIICPS_SLV_PAUSE    0xE0004018 //Slave Monitor Pause Register
#define XIICPS_TIME_OUT     0xE000401C //Time out register
#define XIICPS_IMR          0xE0004020 //Interrupt mask register
#define XIICPS_IER          0xE0004024 //Interrupt Enable Register
#define XIICPS_IDR          0xE0004028 //Interrupt Disable Register

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"


int main()
{
    init_platform();
    initI2C();

    while(1){
        printf("Write start\n\r");
        writeI2C(0x6C, 0x00);       //I have device with 0x6C adress connected;
        printf("Write done\n\r");
    }

    cleanup_platform();
    return 0;
}

void initI2C(){
    *((unsigned int*)XIICPS_CR) = 0x0000905E;   //((15:14)CLK_A = 2, (13:8)CLK_B = 16, (6)CLR_FIFO=1, (5)MONITOR_MODE=0, (4)HOLD=1, (3)1, (2)1, (1)MASTER=1, (0)rv = 0)
    *((unsigned int*)XIICPS_TIME_OUT) = 0x000000FF; //set timeout to 255
    *((unsigned int*)XIICPS_IER) = 0x00000000;  //no interupts (I'm pretty sure, that this line can't do anything, but it's in datasheet...)
    *((unsigned int*)XIICPS_IDR) = 0x000002FF;  //no interupts
    return;
}

void writeI2C(unsigned addr, unsigned data){
    *((unsigned int*)XIICPS_CR) = (*((unsigned int*)XIICPS_CR)|0x00000040)&0xFFFFFFFE; //CLR_FIFO and WRITE_MODE
    
    *((unsigned int*)XIICPS_DATA) = data;   //When I debug this with JTAG, I can see XIICPS_TRANS_SIZE increment by this lines. So data goes into FIFO properly, right?
    *((unsigned int*)XIICPS_DATA) = data;
    *((unsigned int*)XIICPS_DATA) = data;
    *((unsigned int*)XIICPS_DATA) = data;

    *((unsigned int*)XIICPS_ADDR) = addr;

    while(*((unsigned int*)XIICPS_SR) != 0){    //this loop will never exit. Data sits in FIFO forever. No errors in status or interupt status registers, everything looks fine.
            print("Wait1...\n\r");
        }

    while(*((unsigned int*)XIICPS_ISR)&0x00000001 == 0){
        print("Wait2...\n\r");
    }
    return;
    
}
//I2C寄存器
#定义XIICPS\U CR 0xE0004000//控制寄存器
#定义XIICPS_SR 0xE0004004//状态寄存器
#定义XIICPS_ADDR 0xE0004008//IIC地址寄存器
#定义XIICPS_数据0xE000400C//IIC数据寄存器
#定义XIICPS_ISR 0xE0004010//IIC中断状态寄存器
#定义XIICPS\U传输大小0xE0004014//传输大小寄存器
#定义XIICPS\U SLV\U暂停0xE0004018//从监视器暂停寄存器
#定义XIICPS\U TIME\U OUT 0xE000401C//超时寄存器
#定义XIICPS\U IMR 0xE0004020//中断掩码寄存器
#定义XIICPS_IER 0xE0004024//中断启用寄存器
#定义XIICPS_IDR 0xE0004028//中断禁用寄存器
#包括
#包括“platform.h”
#包括“xil_printf.h”
int main()
{
init_平台();
initI2C();
而(1){
printf(“写入开始\n\r”);
writeI2C(0x6C,0x00);//我已连接具有0x6C地址的设备;
printf(“写入完成\n\r”);
}
清理平台();
返回0;
}
void initI2C(){
*((无符号整数*)XIICPS_CR)=0x0000905E;/((15:14)时钟A=2,(13:8)时钟B=16,(6)时钟FIFO=1,(5)监视器模式=0,(4)保持=1,(3)1,(2)1,(1)主控=1,(0)rv=0)
*((unsigned int*)XIICPS\u TIME\u OUT)=0x000000FF;//将超时设置为255
*((unsigned int*)XIICPS_IER)=0x00000000;//没有中断(我很确定,这行不能做任何事情,但它在数据表中…)
*((unsigned int*)XIICPS_IDR)=0x000002FF;//无中断
返回;
}
void writeI2C(无符号地址、无符号数据){
*((无符号int*)XIICPS_CR)=(*((无符号int*)XIICPS_CR)| 0x00000040)&0xfffffe;//CLR_FIFO和写入模式
*((unsigned int*)XIICPS_DATA)=DATA;//当我用JTAG调试时,我可以看到XIICPS_TRANS_大小按这行递增。所以数据正确地进入FIFO,对吗?
*((无符号整数*)XIICPS_DATA)=数据;
*((无符号整数*)XIICPS_DATA)=数据;
*((无符号整数*)XIICPS_DATA)=数据;
*((无符号整数*)XIICPS_ADDR)=ADDR;
虽然(*(unsigned int*)XIICPS_SR)!=0{//此循环将永远不会退出。数据永远位于FIFO中。状态或中断状态寄存器中没有错误,但一切看起来都很正常。
打印(“Wait1…\n\r”);
}
while(*(unsigned int*)XIICPS_ISR)&0x00000001==0){
打印(“Wait2…\n\r”);
}
返回;
}

我不知道这个特定的I2C设备,但是。。。对我来说,将相同的数据值写入数据寄存器4次看起来很奇怪。此外,参考手册中的快速查看似乎表明顺序应为:数据添加数据数据数据。这只是为了测试,稍后应使用激励索引读取一些数组。这只是概念证明。我不知道这个特定的I2C设备,但。。。对我来说,将相同的数据值写入数据寄存器4次看起来很奇怪。此外,参考手册中的快速查看似乎表明顺序应为:数据添加数据数据数据。这只是为了测试,稍后应使用激励索引读取一些数组。这只是概念的证明。