Other Parts Discussed in Thread: ADS1015
Hi,
I am having issues using libiio to read from ADS1015.
I can get access to the context and the device. I can even enable the desired channels but when I run the function to create the buffer iio_device_create_buffer I'm always getting a null.
It is displaying errno 22 : Invalid argument
I use this function (iio_channel_is_scan_element) to make sure that the channels are buffer capable.
iio_info output :
iio:device2: ads1015
9 channels found:
voltage0-voltage1: (input, index: 0, format: le:s-12/16->>4)
3 channel-specific attributes found:
attr 0: scale value: 3.000000000
attr 1: raw value: 0
attr 2: sampling_frequency value: 128
voltage0-voltage3: (input, index: 1, format: le:s-12/16->>4)
3 channel-specific attributes found:
attr 0: raw value: 0
attr 1: scale value: 3.000000000
attr 2: sampling_frequency value: 128
voltage1-voltage3: (input, index: 2, format: le:s-12/16->>4)
3 channel-specific attributes found:
attr 0: raw value: 0
attr 1: scale value: 3.000000000
attr 2: sampling_frequency value: 128
voltage2-voltage3: (input, index: 3, format: le:s-12/16->>4)
3 channel-specific attributes found:
attr 0: scale value: 3.000000000
attr 1: raw value: 0
attr 2: sampling_frequency value: 128
voltage0: (input, index: 4, format: le:s-12/16->>4)
3 channel-specific attributes found:
attr 0: scale value: 2.000000000
attr 1: raw value: 0
attr 2: sampling_frequency value: 3300
voltage1: (input, index: 5, format: le:s-12/16->>4)
3 channel-specific attributes found:
attr 0: sampling_frequency value: 3300
attr 1: scale value: 2.000000000
attr 2: raw value: 0
voltage2: (input, index: 6, format: le:s-12/16->>4)
3 channel-specific attributes found:
attr 0: scale value: 2.000000000
attr 1: sampling_frequency value: 3300
attr 2: raw value: 0
voltage3: (input, index: 7, format: le:s-12/16->>4)
3 channel-specific attributes found:
attr 0: scale value: 2.000000000
attr 1: raw value: 0
attr 2: sampling_frequency value: 3300
timestamp: (input, index: 8, format: le:s-64/64->>0)
code:
nt main () {
struct iio_context* ctx = iio_create_local_context();
if (!ctx) {
LOG(ERROR) << "No context found";
return;
}
struct iio_device *dev = iio_context_find_device(ctx, deviceName.c_str());
if (!dev) {
LOG(ERROR) << "ADS1015 not found";
return;
}
struct iio_channel** voltage = new iio_channel*[4];
for (int i = 0; i < 4; i++) {
voltage[i] = iio_device_get_channel(dev, i+4);
LOG(INFO) << "Channel found: " << iio_channel_get_id(voltage[i]);
}
if (!voltage[0] || !voltage[1] || !voltage[2] || !voltage[3]) {
LOG(ERROR) << "Channels not found";
delete[] voltage;
return;
}
LOG(INFO) << "Sample size " << iio_device_get_sample_size(dev);
for (int i = 0; i < 4; i++) {
if (iio_channel_is_scan_element(voltage[i])) {
iio_channel_enable(voltage[i]);
if (iio_channel_is_enabled(voltage[i])) LOG(INFO) << "Channel enable: " << iio_channel_get_id(voltage[i]);
}
}
LOG(INFO) << "Sample size " << iio_device_get_sample_size(dev) << " bytes";
size_t buffer_length = SAMPLE_CNT;
dev = iio_context_find_device(ctx, deviceName.c_str());
if (dev) buffer = iio_device_create_buffer(dev, buffer_length, false);
if (!buffer) {
LOG(ERROR) << "Error creating buffer " << errno;
delete[] voltage;
return;
}
}