FPGARelated.com
Forums

VHDL I2c burst read

Started by Unknown January 5, 2017
Dear All, please help with VHDL, i connected MPU6050 to my FPGA board.

I used  www.eewiki.com tutorial, can anybody exlpain me how to read burst data 16 bits from 2 registers  or  6 regsiters ? by only one operation ?

I use https://eewiki.net/pages/viewpage.action?pageId=11042934#SPItoI2CBridge(VHDL)-CodeDownload but reads only 1 byte .

any suggestion would be  appreciated/
On 1/5/2017 6:36 AM, abirov@gmail.com wrote:
> Dear All, please help with VHDL, i connected MPU6050 to my FPGA board. > > I used www.eewiki.com tutorial, can anybody exlpain me how to read burst data 16 bits from 2 registers or 6 regsiters ? by only one operation ? > > I use https://eewiki.net/pages/viewpage.action?pageId=11042934#SPItoI2CBridge(VHDL)-CodeDownload but reads only 1 byte . > > any suggestion would be appreciated/
The eewiki page is about connecting an SPI master to an I2C slave through an FPGA. Is that what you are doing? The intro says the bridge will read 8 bit I2C registers. It doesn't say anything about reading multiple registers in one SPI operation. In fact, the SPI Mode section says the SPI interface must receive a 33 bit command to transfer a single 8 bit byte from the I2C slave to the SPI master. I think if you want to do large transfers in one operation you will need to substantially change the SPI interface in the FPGA and possibly the rest of the design as well. -- Rick C
On Thursday, January 5, 2017 at 6:33:36 PM UTC+6, rickman wrote:
> On 1/5/2017 6:36 AM, abirov@gmail.com wrote: > > Dear All, please help with VHDL, i connected MPU6050 to my FPGA board. > > > > I used www.eewiki.com tutorial, can anybody exlpain me how to read burst data 16 bits from 2 registers or 6 regsiters ? by only one operation ? > > > > I use https://eewiki.net/pages/viewpage.action?pageId=11042934#SPItoI2CBridge(VHDL)-CodeDownload but reads only 1 byte . > > > > any suggestion would be appreciated/ > > The eewiki page is about connecting an SPI master to an I2C slave > through an FPGA. Is that what you are doing? > > The intro says the bridge will read 8 bit I2C registers. It doesn't say > anything about reading multiple registers in one SPI operation. In > fact, the SPI Mode section says the SPI interface must receive a 33 bit > command to transfer a single 8 bit byte from the I2C slave to the SPI > master. > > I think if you want to do large transfers in one operation you will need > to substantially change the SPI interface in the FPGA and possibly the > rest of the design as well. > > -- > > Rick C
Yes it is, i try to change i2c_to_spi conversion to i2c_to_PWM for servo, so I need 16 bit word from 2 register.
On Thursday, January 5, 2017 at 6:33:36 PM UTC+6, rickman wrote:
> On 1/5/2017 6:36 AM, abirov@gmail.com wrote: > > Dear All, please help with VHDL, i connected MPU6050 to my FPGA board. > > > > I used www.eewiki.com tutorial, can anybody exlpain me how to read burst data 16 bits from 2 registers or 6 regsiters ? by only one operation ? > > > > I use https://eewiki.net/pages/viewpage.action?pageId=11042934#SPItoI2CBridge(VHDL)-CodeDownload but reads only 1 byte . > > > > any suggestion would be appreciated/ > > The eewiki page is about connecting an SPI master to an I2C slave > through an FPGA. Is that what you are doing? > > The intro says the bridge will read 8 bit I2C registers. It doesn't say > anything about reading multiple registers in one SPI operation. In > fact, the SPI Mode section says the SPI interface must receive a 33 bit > command to transfer a single 8 bit byte from the I2C slave to the SPI > master. > > I think if you want to do large transfers in one operation you will need > to substantially change the SPI interface in the FPGA and possibly the > rest of the design as well. > > -- > > Rick C
I made register map file where is just puts device address, register address and value to make write or read operation and it write some value to initial device and reads results, but only 8 bits . I think somewhere in I2C master or user logic file need to make edition. But my knowledge of VHDL is limited and cannot develop it more ))).
On 1/5/2017 8:25 AM, abirov@gmail.com wrote:
> On Thursday, January 5, 2017 at 6:33:36 PM UTC+6, rickman wrote: >> >> The eewiki page is about connecting an SPI master to an I2C slave >> through an FPGA. Is that what you are doing? >> >> The intro says the bridge will read 8 bit I2C registers. It doesn't say >> anything about reading multiple registers in one SPI operation. In >> fact, the SPI Mode section says the SPI interface must receive a 33 bit >> command to transfer a single 8 bit byte from the I2C slave to the SPI >> master. >> >> I think if you want to do large transfers in one operation you will need >> to substantially change the SPI interface in the FPGA and possibly the >> rest of the design as well. > > I made register map file where is just puts device address, register address and value to make write or read operation and it write some value to initial device and reads results, but only 8 bits . > I think somewhere in I2C master or user logic file need to make edition. But my knowledge of VHDL is limited and cannot develop it more ))).
VHDL isn't the issue until you understand how to use the I2C bus. Your other post seemed to indicate you are using an I2C master to control a servo with a PWM signal. Is that correct? I am no expert on I2C, but I believe it is not hard to send two bytes in one command. You need to study the I2C bus spec. If the entire I2C to PWM design is in your FPGA it should not be hard to design it to not glitch as the two 8 bit registers are updated separately. So there are two ways to do this. -- Rick C
torsdag 5. januar 2017 12.36.19 UTC+1 skrev abi...@gmail.com følgende:
> Dear All, please help with VHDL, i connected MPU6050 to my FPGA board. > > I used www.eewiki.com tutorial, can anybody exlpain me how to read burst data 16 bits from 2 registers or 6 regsiters ? by only one operation ? > > I use https://eewiki.net/pages/viewpage.action?pageId=11042934#SPItoI2CBridge(VHDL)-CodeDownload but reads only 1 byte . > > any suggestion would be appreciated/
I learned a lot of I2C from the I2C reference design for picoblaze embedded microcontroller in Xilinx. Picoblaze has a complete tool chain from assembler to VHDL, and the code for the mcu can be downloaded to chip with JTAG to shorten development cycle.
I modified user logic from eewiki.com if someone need please use code below :

      WHEN read_data =>   ------------------------------------------------     
 
          message0 (15 downto 0)    <= "0000000000000000";
             
             i2c_busy_prev <= i2c_busy;                     
          IF (i2c_busy_prev = '0' AND i2c_busy = '1') THEN
              i2c_busy_cnt := i2c_busy_cnt + 1;                 
          END IF;
          CASE i2c_busy_cnt IS         
            WHEN 0 =>                                                
              i2c_ena     <= '1';               
              i2c_addr    <= data_in(6 downto 0);        
              i2c_rw      <= '0';                                      
              i2c_data_wr <= data_in(14 downto 7);      
            WHEN 1 =>
              i2c_ena     <= '1';               
              i2c_rw      <= data_in(15);                              
              i2c_data_wr <= data_in(23 downto 16);                                                   
            WHEN 2 =>                                                 
              i2c_ena     <= '1';              
              IF (i2c_busy = '0') THEN 
       message(15 downto 8) <= i2c_data_rd;                                                                            
              END IF;
            WHEN 3 =>                                                 
              i2c_ena     <= '0';              
              IF (i2c_busy = '0') THEN 
              message(7 downto 0) <= i2c_data_rd;                        
                  message(16)          <= i2c_ack_err;
              i2c_busy_cnt        := 0;                               
              state               <= combine;                       
              END IF;
            WHEN OTHERS => NULL;