Correct 10bit Device address handling.
The existing code did not follow protocol with 10bit addressed devices. Per _Philps/NXP Semiconductors UM10204 I2C-bus specification and user manual Rev. 6 4April2014_ pg.15 3.1.11 10-bit addressing: ~The first seven bits of the first byte are the combination of 1111 0xx of which the last two bits (xx) are the two Most-Significant Bits (MSB) of the 10-bit address; the eighth bit of the first byte is the R/!W! bit the determines the direction of the message~
This commit is contained in:
		
							parent
							
								
									0c038b4063
								
							
						
					
					
						commit
						a695187de8
					
				| @ -176,10 +176,13 @@ i2c_err_t i2cWrite(i2c_t * i2c, uint16_t address, bool addr_10bit, uint8_t * dat | |||||||
| 
 | 
 | ||||||
|         //CMD WRITE(ADDRESS + DATA)
 |         //CMD WRITE(ADDRESS + DATA)
 | ||||||
|         if(!index) { |         if(!index) { | ||||||
|             i2c->dev->fifo_data.data = address & 0xFF; |             if(addr_10bit){// address is leftshifted with Read/Write bit set
 | ||||||
|             dataSend--; |                 i2c->dev->fifo_data.data = (((address >> 8) & 0x6) | 0xF0); // send a9:a8 plus 1111 0xxW mask
 | ||||||
|             if(addr_10bit) { |                 i2c->dev->fifo_data.data = ((address >> 1) & 0xFF); // send a7:a0, remove W bit (7bit address style)
 | ||||||
|                 i2c->dev->fifo_data.data = (address >> 8) & 0xFF; |                 dataSend -= 2; | ||||||
|  |             } | ||||||
|  |             else { // 7bit address
 | ||||||
|  |                 i2c->dev->fifo_data.data = address & 0xFF; | ||||||
|                 dataSend--; |                 dataSend--; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -272,10 +275,14 @@ i2c_err_t i2cRead(i2c_t * i2c, uint16_t address, bool addr_10bit, uint8_t * data | |||||||
|     i2cSetCmd(i2c, 0, I2C_CMD_RSTART, 0, false, false, false); |     i2cSetCmd(i2c, 0, I2C_CMD_RSTART, 0, false, false, false); | ||||||
| 
 | 
 | ||||||
|     //CMD WRITE ADDRESS
 |     //CMD WRITE ADDRESS
 | ||||||
|     i2c->dev->fifo_data.val = address & 0xFF; |     if(addr_10bit){// address is leftshifted with Read/Write bit set
 | ||||||
|     if(addr_10bit) { |        i2c->dev->fifo_data.data = (((address >> 8) & 0x6) | 0xF1); // send a9:a8 plus 1111 0xxR mask
 | ||||||
|         i2c->dev->fifo_data.val = (address >> 8) & 0xFF; |        i2c->dev->fifo_data.data = ((address >> 1) & 0xFF); // send a7:a0, remove R bit (7bit address style)
 | ||||||
|     } |     } | ||||||
|  |     else { // 7bit address
 | ||||||
|  |        i2c->dev->fifo_data.data = address & 0xFF; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     i2cSetCmd(i2c, 1, I2C_CMD_WRITE, addrLen, false, false, true); |     i2cSetCmd(i2c, 1, I2C_CMD_WRITE, addrLen, false, false, true); | ||||||
| 
 | 
 | ||||||
|     while(len) { |     while(len) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user