Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
drv2665.cpp@0:b85fd3fdfcfa, 2016-05-25 (annotated)
- Committer:
- akashvibhute
- Date:
- Wed May 25 03:17:20 2016 +0000
- Revision:
- 0:b85fd3fdfcfa
- Child:
- 1:e2c726c628dc
initial commit
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| akashvibhute | 0:b85fd3fdfcfa | 1 | /** |
| akashvibhute | 0:b85fd3fdfcfa | 2 | * DRV2665 library |
| akashvibhute | 0:b85fd3fdfcfa | 3 | * |
| akashvibhute | 0:b85fd3fdfcfa | 4 | * @author Akash Vibhute |
| akashvibhute | 0:b85fd3fdfcfa | 5 | * @author < akash . roboticist [at] gmail . com > |
| akashvibhute | 0:b85fd3fdfcfa | 6 | * @version 0.1 |
| akashvibhute | 0:b85fd3fdfcfa | 7 | * @date May/24/2016 |
| akashvibhute | 0:b85fd3fdfcfa | 8 | */ |
| akashvibhute | 0:b85fd3fdfcfa | 9 | |
| akashvibhute | 0:b85fd3fdfcfa | 10 | #include "drv2665.h" |
| akashvibhute | 0:b85fd3fdfcfa | 11 | #define M_PI 3.14159265358979 |
| akashvibhute | 0:b85fd3fdfcfa | 12 | |
| akashvibhute | 0:b85fd3fdfcfa | 13 | DRV2665_DIGITAL::DRV2665_DIGITAL( PinName sda, PinName scl ):i2c_(sda, scl) |
| akashvibhute | 0:b85fd3fdfcfa | 14 | { |
| akashvibhute | 0:b85fd3fdfcfa | 15 | i2c_addr = DRV2665_I2C_ADDRESS << 1; |
| akashvibhute | 0:b85fd3fdfcfa | 16 | wait_ms(2); //wait 2ms for i2c bus |
| akashvibhute | 0:b85fd3fdfcfa | 17 | } |
| akashvibhute | 0:b85fd3fdfcfa | 18 | |
| akashvibhute | 0:b85fd3fdfcfa | 19 | void DRV2665_DIGITAL::init(uint8_t output_gain, uint8_t idle_timeout) |
| akashvibhute | 0:b85fd3fdfcfa | 20 | { |
| akashvibhute | 0:b85fd3fdfcfa | 21 | write(DRV2665_CTRL_2, 0); //clear standby |
| akashvibhute | 0:b85fd3fdfcfa | 22 | write(DRV2665_CTRL_1, (DRV2665_DIGITAL_IN | output_gain)); //set mode digital, set gain |
| akashvibhute | 0:b85fd3fdfcfa | 23 | write(DRV2665_CTRL_2, idle_timeout); //set timeout period |
| akashvibhute | 0:b85fd3fdfcfa | 24 | } |
| akashvibhute | 0:b85fd3fdfcfa | 25 | |
| akashvibhute | 0:b85fd3fdfcfa | 26 | void DRV2665_DIGITAL::reset() |
| akashvibhute | 0:b85fd3fdfcfa | 27 | { |
| akashvibhute | 0:b85fd3fdfcfa | 28 | write(DRV2665_CTRL_2, DRV2665_DEV_RST); |
| akashvibhute | 0:b85fd3fdfcfa | 29 | } |
| akashvibhute | 0:b85fd3fdfcfa | 30 | |
| akashvibhute | 0:b85fd3fdfcfa | 31 | void DRV2665_DIGITAL::outputWave(int8_t waveform[], uint8_t length) |
| akashvibhute | 0:b85fd3fdfcfa | 32 | { |
| akashvibhute | 0:b85fd3fdfcfa | 33 | if(fifo_check()) { |
| akashvibhute | 0:b85fd3fdfcfa | 34 | for(int i=0; i<length; i++) { |
| akashvibhute | 0:b85fd3fdfcfa | 35 | write(DRV2665_FIFO, waveform[i]); |
| akashvibhute | 0:b85fd3fdfcfa | 36 | wait_us(5); |
| akashvibhute | 0:b85fd3fdfcfa | 37 | } |
| akashvibhute | 0:b85fd3fdfcfa | 38 | } else |
| akashvibhute | 0:b85fd3fdfcfa | 39 | return; |
| akashvibhute | 0:b85fd3fdfcfa | 40 | } |
| akashvibhute | 0:b85fd3fdfcfa | 41 | |
| akashvibhute | 0:b85fd3fdfcfa | 42 | void DRV2665_DIGITAL::outputSine(uint16_t hz) |
| akashvibhute | 0:b85fd3fdfcfa | 43 | { |
| akashvibhute | 0:b85fd3fdfcfa | 44 | int8_t waveform_byte; |
| akashvibhute | 0:b85fd3fdfcfa | 45 | uint16_t length; |
| akashvibhute | 0:b85fd3fdfcfa | 46 | |
| akashvibhute | 0:b85fd3fdfcfa | 47 | //in the linux driver example, a 41 byte waveform plays back at 8kHz |
| akashvibhute | 0:b85fd3fdfcfa | 48 | //wavelength 41 -> wave time 125us -> frequency 8kHz |
| akashvibhute | 0:b85fd3fdfcfa | 49 | //hence per byte sampling time = 125us / 41 = 3.04878049 |
| akashvibhute | 0:b85fd3fdfcfa | 50 | //ie 41 bytes :: 8kHz -> 328 bytes :: 1000Hz |
| akashvibhute | 0:b85fd3fdfcfa | 51 | //calculations done here are from this factor |
| akashvibhute | 0:b85fd3fdfcfa | 52 | |
| akashvibhute | 0:b85fd3fdfcfa | 53 | length = (1000 * 328) / hz; |
| akashvibhute | 0:b85fd3fdfcfa | 54 | |
| akashvibhute | 0:b85fd3fdfcfa | 55 | /* |
| akashvibhute | 0:b85fd3fdfcfa | 56 | //If the above assumption is incorrect, it could be that the DRV plays |
| akashvibhute | 0:b85fd3fdfcfa | 57 | //anything in its FIFO at a fix rate of 8ksps in that case, it would mean |
| akashvibhute | 0:b85fd3fdfcfa | 58 | //a per byte play time of 125us, ie for a 100byte wavelength -> a playback |
| akashvibhute | 0:b85fd3fdfcfa | 59 | //time of 1.25ms (800Hz) |
| akashvibhute | 0:b85fd3fdfcfa | 60 | //So, 100B :: 800Hz -> 100*800B :: 1Hz |
| akashvibhute | 0:b85fd3fdfcfa | 61 | //For 'n' Hz :: (100*800/n) B |
| akashvibhute | 0:b85fd3fdfcfa | 62 | |
| akashvibhute | 0:b85fd3fdfcfa | 63 | length = (100 * 800) / hz; |
| akashvibhute | 0:b85fd3fdfcfa | 64 | */ |
| akashvibhute | 0:b85fd3fdfcfa | 65 | |
| akashvibhute | 0:b85fd3fdfcfa | 66 | |
| akashvibhute | 0:b85fd3fdfcfa | 67 | for(int i=0; i<length; i++) { |
| akashvibhute | 0:b85fd3fdfcfa | 68 | waveform_byte = (uint8_t)(102.0 * sin(2*M_PI*i/(length-1))); //102 is the max +ve / -ve value, typecasting in uint8 turns -ve values into 2's complement required by the driver |
| akashvibhute | 0:b85fd3fdfcfa | 69 | |
| akashvibhute | 0:b85fd3fdfcfa | 70 | write(DRV2665_FIFO, waveform_byte); |
| akashvibhute | 0:b85fd3fdfcfa | 71 | wait_us(5); |
| akashvibhute | 0:b85fd3fdfcfa | 72 | |
| akashvibhute | 0:b85fd3fdfcfa | 73 | while(!fifo_check()) |
| akashvibhute | 0:b85fd3fdfcfa | 74 | wait_us(5); |
| akashvibhute | 0:b85fd3fdfcfa | 75 | } |
| akashvibhute | 0:b85fd3fdfcfa | 76 | } |
| akashvibhute | 0:b85fd3fdfcfa | 77 | |
| akashvibhute | 0:b85fd3fdfcfa | 78 | bool DRV2665_DIGITAL::fifo_check() |
| akashvibhute | 0:b85fd3fdfcfa | 79 | { |
| akashvibhute | 0:b85fd3fdfcfa | 80 | uint8_t reply; |
| akashvibhute | 0:b85fd3fdfcfa | 81 | reply = read(DRV2665_STATUS); |
| akashvibhute | 0:b85fd3fdfcfa | 82 | |
| akashvibhute | 0:b85fd3fdfcfa | 83 | if((reply & 0x01) == 0) |
| akashvibhute | 0:b85fd3fdfcfa | 84 | return(true); |
| akashvibhute | 0:b85fd3fdfcfa | 85 | else |
| akashvibhute | 0:b85fd3fdfcfa | 86 | return(false); |
| akashvibhute | 0:b85fd3fdfcfa | 87 | } |
| akashvibhute | 0:b85fd3fdfcfa | 88 | |
| akashvibhute | 0:b85fd3fdfcfa | 89 | void DRV2665_DIGITAL::en_override(bool en) |
| akashvibhute | 0:b85fd3fdfcfa | 90 | { |
| akashvibhute | 0:b85fd3fdfcfa | 91 | write(DRV2665_CTRL_2, DRV2665_BOOST_EN); |
| akashvibhute | 0:b85fd3fdfcfa | 92 | } |
| akashvibhute | 0:b85fd3fdfcfa | 93 | |
| akashvibhute | 0:b85fd3fdfcfa | 94 | uint8_t DRV2665_DIGITAL::read(char reg) |
| akashvibhute | 0:b85fd3fdfcfa | 95 | { |
| akashvibhute | 0:b85fd3fdfcfa | 96 | //Create a temporary buffer |
| akashvibhute | 0:b85fd3fdfcfa | 97 | char buff[2]; |
| akashvibhute | 0:b85fd3fdfcfa | 98 | |
| akashvibhute | 0:b85fd3fdfcfa | 99 | //Select the register |
| akashvibhute | 0:b85fd3fdfcfa | 100 | i2c_.write(i2c_addr, ®, 1, true); |
| akashvibhute | 0:b85fd3fdfcfa | 101 | |
| akashvibhute | 0:b85fd3fdfcfa | 102 | //Read the 16-bit register |
| akashvibhute | 0:b85fd3fdfcfa | 103 | i2c_.read(i2c_addr, buff, 2); |
| akashvibhute | 0:b85fd3fdfcfa | 104 | |
| akashvibhute | 0:b85fd3fdfcfa | 105 | //Return the combined 16-bit value |
| akashvibhute | 0:b85fd3fdfcfa | 106 | return (buff[0] << 8) | buff[1]; |
| akashvibhute | 0:b85fd3fdfcfa | 107 | } |
| akashvibhute | 0:b85fd3fdfcfa | 108 | |
| akashvibhute | 0:b85fd3fdfcfa | 109 | void DRV2665_DIGITAL::write(char reg, uint8_t data) |
| akashvibhute | 0:b85fd3fdfcfa | 110 | { |
| akashvibhute | 0:b85fd3fdfcfa | 111 | //Create a temporary buffer |
| akashvibhute | 0:b85fd3fdfcfa | 112 | char buff[2]; |
| akashvibhute | 0:b85fd3fdfcfa | 113 | |
| akashvibhute | 0:b85fd3fdfcfa | 114 | //Load the register address and 16-bit data |
| akashvibhute | 0:b85fd3fdfcfa | 115 | buff[0] = reg; |
| akashvibhute | 0:b85fd3fdfcfa | 116 | buff[1] = data; |
| akashvibhute | 0:b85fd3fdfcfa | 117 | |
| akashvibhute | 0:b85fd3fdfcfa | 118 | //Write the data |
| akashvibhute | 0:b85fd3fdfcfa | 119 | i2c_.write(i2c_addr, buff, 2); |
| akashvibhute | 0:b85fd3fdfcfa | 120 | } |