Here's part of some code for ST's LSM330DLC that looks like it has all the same registers for your gyroscope. Be sure to correct the address for your device.
Since it's a lengthy program, I'll just list the basic functions.
I used the MSSP module of the PIC18F14K50 so it can run in the background.
The read routine was called using the DRDY interrupt output of the device.
MSSP config:
Gyro register configs:Code:SSPSTAT.7 = 0 ' Slew rate control set to 400KHz SSPSTAT.6 = 0 ' SMBus compliance disabled SSPCON1 = %00101000 ' Enbles I2C module and Master mode SSPADD = $1A ' Baud rate clock divider bits set for 400KHz ' Adjusted from $1D = 368KHz CLEAR ' Set all registers to 0 XYZ_RAM VAR BYTE[12] ' Array for 16 bit data, 2 bytes each. First 6 for accelerometer, last 6 for gyro
Gyro register reading routine:Code:'========================================================================= ' Gyroscope configuration ' Load time for all 13 Registers is 1029us at 400KHz setting ' Registers loaded in order specified by data sheet: ' 1. Write CTRL_REG2 ' 2. Write CTRL_REG3 ' 3. Write CTRL_REG4 ' 4. Write CTRL_REG5 ' 5. Write Reference ' 6. Write INT1_THS ' 7. Write INT1_DUR ' 8. Write INT1_CFG ' 9. Write CTRL_REG5 ' 10. Write CTRL_REG1 '========================================================================= Config_Gyr: ' Load CTRL_REG2: 10100111, Edge sensitive trigger, HP filter = Normal, ' HP cutoff = 0.09Hz GOSUB Start_Gyr ' Adresss the device SSPBUF = $21 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %10100111 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data ' Load CTRL_REG3: 10000000, INT1_G enabled, no Boot Status, Active High, ' Push-pull output. INT2_G disabled GOSUB Start_Gyr ' Adresss the device SSPBUF = $22 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %00000000 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data ' Load CTRL_REG4: 01110000, cont. update, MSB @ lower address, 2000dps ' non SPI GOSUB Start_Gyr ' Adresss the device SSPBUF = $23 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %01110000 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data '////////////////// XYZ Interrupt threshold settings //////////////////// ' Threshold level = THS / 0.061dps, where THS = 540dps (1.5 turns/sec) ' Maximum threshold level is 1/2 of Full Scale ' 14bit result is loaded into HI/LO registers of each axis '//////////////////////////////////////////////////////////////////////// ' Load INT1_THS_XH: 00100010, Interrupt MSB threshold bits 14:8 GOSUB Start_Gyr ' Adresss the device SSPBUF = $32 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %00100010 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data ' Load INT1_THS_XL: 10010100, Interrupt LSB threshold bits 7:0 GOSUB Start_Gyr ' Adresss the device SSPBUF = $33 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %10010100 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data ' Load INT1_THS_YH: 00100010, Interrupt MSB threshold bits 14:8 GOSUB Start_Gyr ' Adresss the device SSPBUF = $34 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %00100010 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data ' Load INT1_THS_YL: 10010100, Interrupt LSB threshold bits 7:0 GOSUB Start_Gyr ' Adresss the device SSPBUF = $35 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %10010100 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data ' Load INT1_THS_ZH: 00100010, Interrupt MSB threshold bits 14:8 GOSUB Start_Gyr ' Adresss the device SSPBUF = $36 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %00100010 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data ' Load INT1_THS_ZL: 10010100, Interrupt LSB threshold bits 7:0 GOSUB Start_Gyr ' Adresss the device SSPBUF = $37 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %10010100 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data '|||||||||||||||| end XYZ Interrupt threshold settings |||||||||||||||||| '////////////////// Duration set value ////////////////////////////////// ' The ODR sets the LSB; 1/190Hz = 5.26ms ' The maximum Duration time is 6 bit or 128, Max = 128 * 5.26ms = 673ms ' The bit value = Duration/5.26ms '/////////////////////////////////////////////////////////////////////// ' Load INT1_Duration: 10000001, Wait enabled, Duration set to 1.3ms GOSUB Start_Gyr ' Adresss the device SSPBUF = $38 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %10000000 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data ' Load INT1_CFG: 00101010, OR combo of INT, not Latched, interrupt request ' on measured value HIGHER than preset threshold GOSUB Start_Gyr ' Adresss the device SSPBUF = $30 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %00101010 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data ' Load CTRL_REG5: 00011010, Reboot mem Norm, FIFO disabled, HPen enabled, ' Out_SEL = HPF+LPF2, INT1 = HPF+LPF2 GOSUB Start_Gyr ' Adresss the device SSPBUF = $24 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %00011010 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data ' Load CTRL_REG1: 00111111, ODR=95Hz, LPF1=12.5Hz, LPF2=50Hz, Norm PWR, ' ZYX axes enabled GOSUB Start_Gyr ' Adresss the device SSPBUF = $20 ' Transmit register address WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task SSPBUF = %00001111 ' Transmit the 8bit data to register WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag GOSUB Stop_I2C ' Complete TX data RETURN '||||||||||||||||||| end Gyroscope configuration ||||||||||||||||||||||||
I2C Start and Stop routines:Code:'//////////////////// Gyroscope XYZ data reading //////////////////////// ' Recommended way of reading sequential registers ' ' Master Slave Note ' 1. ST Sends Start condition ' 2. SAD+W Sends Slave Address including Write bit ' 3. SAK Sends Acknowledge ' 4. SUB Sends Sub Address (1st register address to read) ' 5. SAK Sends Acknowledge ' 6. SR Sends a Repeated Start condition ' 7. SAD+R Sends Slave Address including Read bit ' 8. SAK Sends Acknowledge ' 9. Data Sends Data ' 10. MAK Sends Acknowledge ' 11. Data Sends Data ' 12. MAK Sends Acknowledge ' 13. Data Sends Data (Process repeated) ' 14. NMAK No Acknowledgement sent after last register read ' 15. SP Sends Stop condition ending Read process ' ' Reading all XYZ registers and loading the array takes 237us worst case. '//////////////////////////////////////////////////////////////////////// Read_G_REG: ' Generate Start condition GOSUB Start_Gyr ' Send first register to read with bit #1 set indicating READ and bit #7 ' set indicating multiple reads SSPBUF = %10101000 ' Register 28h with 7 set = $A8 WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task ' Wait for ACK from device WHILE SSPCON2.6 : WEND ' Wait until device sends an ACK ' Send Repeated Start condition SSPCON2.1 = 1 ' Send Repeated Start condition WHILE SSPCON2.1 = 1: WEND ' Wait until MSSP module finishes task ' Send device address with Read bit set SSPBUF = $D7 ' Transmit device address w/READ bit WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task ' Wait for ACK from device WHILE SSPCON2.6 : WEND ' Wait until device sends an ACK '///////////////////// Read the next 6 registers //////////////////////// ' This portion loops through Read sequence 6 times. The Master sends an ' ACK after each read indicating "send another" so no ACK is sent after ' the 6th data packet, a Stop Condition is sent instead to end the READ. '//////////////////////////////////////////////////////////////////////// FOR e = 6 TO 11 ' Receive the 8 bit data from gyroscope SSPCON2.3 = 1 ' Enable the Receiver to clock in data WHILE !SSPSTAT.0: WEND ' Wait until Buffer Full bit is set XYZ_RAM[e] = SSPBUF ' Load each XYZ_RAM byte in array ' Master sends ACK for first 5 data packets IF e != 11 THEN SSPCON2.4 = 1 ' Initiate Acknowledge sequence WHILE SSPCON2.4 = 1: WEND ' Wait until Acknowledge sequence Idle ENDIF NEXT e ' Send Stop condition to end Read function GOSUB Stop_I2C ' Complete RX data read RETURN '||||||||||||||||||| end Gyroscope XYZ data reading |||||||||||||||||||||
Code:'========================================================================= ' Generate Gyroscope Start condition '========================================================================= Start_Gyr: ' Start condition to the transmit device address SSPCON2.0 = 1 ' Generate Start condition WHILE SSPCON2.0 = 1: WEND ' Wait until MSSP module ready to TX PIR1.3 = 0 ' Clear the Interrupt flag SSPBUF = $D6 ' Transmit address that includes WRITE bit WHILE SSPSTAT.2: WEND ' Wait until MSSP module finishes task RETURN '========================================================================= ' Stop I2C routine '========================================================================= Stop_I2C: SSPCON2.2 = 1 ' Initiate Stop condition WHILE SSPCON2.2: WEND ' Wait until MSSP module finishes task PIR1.3 = 0 ' Clear interrupt flag @ nop ; Had to slow it down or it didn't work! @ Nop ; Only 1 was needed but 1 more won't hurt RETURN




Bookmarks