Programmable Devices
CPLDs, FPGAs, SoC FPGAs, Configuration, and Transceivers
21323 Discussions

I got a problem on DE2-TV,I2C_controller

Altera_Forum
Honored Contributor II
1,634 Views

I2C_SCLK begins at SD_COUNTER 4 and ends at SD_COUNTER 30,while I2C_SDAT begins at SD_COUNTER 3 and ends at SD_COUNTER 29.Why don's they transfer data in the same time. 

IN addation ,I2C_SDAT also don't write into I2C_SDAT。 

 

The following is partly the program 

wire I2C_SCLK=SCLK | ( ((SD_COUNTER >= 4) & (SD_COUNTER <=30))? ~CLOCK :0 ); 

wire I2C_SDAT=SDO?1'bz:0 ; 

 

always @(negedge RESET or posedge CLOCK ) begin 

if (!RESET) SD_COUNTER=6'b111111; 

else begin 

if (GO==0)  

SD_COUNTER=0; 

else  

if (SD_COUNTER < 6'b111111) SD_COUNTER=SD_COUNTER+1;  

end 

end 

//---- 

 

always @(negedge RESET or posedge CLOCK ) begin 

if (!RESET) begin SCLK=1;SDO=1; ACK1=0;ACK2=0;ACK3=0; END=1; end 

else 

case (SD_COUNTER) 

6'd0 : begin ACK1=0 ;ACK2=0 ;ACK3=0 ; END=0; SDO=1; SCLK=1;end 

//start 

6'd1 : begin SD=I2C_DATA;SDO=0;end 

6'd2 : SCLK=0; 

//SLAVE ADDR 

6'd3 : SDO=SD[23]; 

6'd4 : SDO=SD[22]; 

6'd5 : SDO=SD[21]; 

6'd6 : SDO=SD[20]; 

6'd7 : SDO=SD[19]; 

6'd8 : SDO=SD[18]; 

6'd9 : SDO=SD[17]; 

6'd10 : SDO=SD[16];  

6'd11 : SDO=1'b1;//ACK 

 

//SUB ADDR 

6'd12 : begin SDO=SD[15]; ACK1=I2C_SDAT; end 

6'd13 : SDO=SD[14]; 

6'd14 : SDO=SD[13]; 

6'd15 : SDO=SD[12]; 

6'd16 : SDO=SD[11]; 

6'd17 : SDO=SD[10]; 

6'd18 : SDO=SD[9]; 

6'd19 : SDO=SD[8]; 

6'd20 : SDO=1'b1;//ACK 

 

//DATA 

6'd21 : begin SDO=SD[7]; ACK2=I2C_SDAT; end 

6'd22 : SDO=SD[6]; 

6'd23 : SDO=SD[5]; 

6'd24 : SDO=SD[4]; 

6'd25 : SDO=SD[3]; 

6'd26 : SDO=SD[2]; 

6'd27 : SDO=SD[1]; 

6'd28 : SDO=SD[0]; 

6'd29 : SDO=1'b1;//ACK 

 

 

//stop 

6'd30 : begin SDO=1'b0; SCLK=1'b0; ACK3=I2C_SDAT; end  

6'd31 : SCLK=1'b1;  

6'd32 : begin SDO=1'b1; END=1; end  

 

endcase 

end 

 

 

Hope for the answer &#65292;thanks
0 Kudos
4 Replies
Altera_Forum
Honored Contributor II
833 Views

the first couple of counts sets up the start condition for the write process and the last couple of counts are the end condition. I2C_DAT is the program data coming into this module and I2C_SDAT is the serial data going to the codec. Hope this helps

0 Kudos
Altera_Forum
Honored Contributor II
833 Views

 

--- Quote Start ---  

the first couple of counts sets up the start condition for the write process and the last couple of counts are the end condition. I2C_DAT is the program data coming into this module and I2C_SDAT is the serial data going to the codec. Hope this helps 

--- Quote End ---  

 

 

Thanks for your help.According to your explanation I understand it. 

And I hope you can help me to solve another problem: 

wire I2C_SDAT=SDO?1'bz:0 ; 

It is the above problem too.It looks like that, the data does not transferred to the slave chip.When the data is "0",the controller writes 0 to I2C_SDAT,but when it is "1",the controller writes "z" to I2C_SDAT ,so writing is shut up. It is about I2C_BUS. 

Thank you very much!
0 Kudos
Altera_Forum
Honored Contributor II
833 Views

I didnt get it myself but you can change it so it either gives '0' or the data bit to be sent. It works either way.

0 Kudos
Altera_Forum
Honored Contributor II
833 Views

Thank you ,I will have a try.

0 Kudos
Reply