Writing a double to I2C device
When I try to use i2cset
on my raspberryPI with mode for SMBus block data
it is saying Error: Adapter does not have SMBus block write capability
.
# sudo i2cset -y 3 0x20 0x01 0xDE 0xAD 0xC0 0xDE 0x00 0xFF s
Error: Adapter does not have SMBus block write capability
I looked at the WiringPi code and it has 2 functions to write data on I2C. The first uses byte data and the second a word data. It is missing the (SMBus block data) and the (I2C block data). So I suppose that RaspberryPi's do not support it.
I want to implement a C++ code that write a double to the i2c on my raspberryPi. To write an int I am already doing.
root@sense4:~/i2c-tests# sudo i2cset -y 3 0x20 0x00 0x1f
root@sense4:~/i2c-tests# sudo i2cget -y 3 0x20 0x00
0x1f
C++ code:
int I2CTools::write8(int value) {
union i2c_smbus_data data;
data.byte = value;
return i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_WRITE, 0x00, I2C_SMBUS_BYTE_DATA, &data);
}
int I2CTools::read8() {
union i2c_smbus_data data;
if (i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_READ, 0x00, I2C_SMBUS_BYTE_DATA, &data))
return -1;
else
return data.byte & 0xFF;
}
Now I suppose that I have to loop over the address like this:
root@sense4:~/i2c-tests# sudo i2cset -y 3 0x20 0x00 0x1f ; sudo i2cset -y 3 0x20 0x01 0x85 ; sudo i2cset -y 3 0x20 0x02 0xeb ; sudo i2cset -y 3 0x20 0x03 0x51 ; sudo i2cset -y 3 0x20 0x04 0xb8 ; sudo i2cset -y 3 0x20 0x05 0x1e ; sudo i2cset -y 3 0x20 0x06 0x09 ; sudo i2cset -y 3 0x20 0x07 0x40
root@sense4:~/i2c-tests# sudo i2cget -y 3 0x20 0x00 ;sudo i2cget -y 3 0x20 0x01 ; sudo i2cget -y 3 0x20 0x02 ; sudo i2cget -y 3 0x20 0x03 ; sudo i2cget -y 3 0x20 0x04 ; sudo i2cget -y 3 0x20 0x05 ; sudo i2cget -y 3 0x20 0x06 ; sudo i2cget -y 3 0x20 0x07
0x1f
0x85
0xeb
0x51
0xb8
0x1e
0x09
0x40
But in C++ of course... Is this make sense for you? I am newbie with i2c devices and I suppose it is this direction that I have to do in my code. Thanks!
int I2CTools::writeDouble(double value) {
union i2c_smbus_data data;
doubleToCharArray.original = value;
std::cout << "nBytes: ";
for (unsigned long address = 0; address < sizeof(double); address++) {
std::cout << (int) doubleToCharArray.output[address] << ' ';
data.byte = (int) doubleToCharArray.output[address];
// std::cout << hex(doubleToCharArray.output[address]) << ' ';
i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_WRITE, address, I2C_SMBUS_BYTE_DATA, &data);
}
return 0;
}
double I2CTools::readDouble() {
unsigned char charArray[sizeof(double)];
std::cout << "nBytes: ";
for (unsigned long address = 0; address < sizeof(double); address++) {
union i2c_smbus_data data;
if (i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_READ, address, I2C_SMBUS_BYTE_DATA, &data)) {
return -1;
} else {
std::cout << (int) data.byte << ' ';
charArray[address] = data.byte;
}
}
return *reinterpret_cast<double *>(charArray);
}
c++ raspberry-pi i2c
add a comment |
When I try to use i2cset
on my raspberryPI with mode for SMBus block data
it is saying Error: Adapter does not have SMBus block write capability
.
# sudo i2cset -y 3 0x20 0x01 0xDE 0xAD 0xC0 0xDE 0x00 0xFF s
Error: Adapter does not have SMBus block write capability
I looked at the WiringPi code and it has 2 functions to write data on I2C. The first uses byte data and the second a word data. It is missing the (SMBus block data) and the (I2C block data). So I suppose that RaspberryPi's do not support it.
I want to implement a C++ code that write a double to the i2c on my raspberryPi. To write an int I am already doing.
root@sense4:~/i2c-tests# sudo i2cset -y 3 0x20 0x00 0x1f
root@sense4:~/i2c-tests# sudo i2cget -y 3 0x20 0x00
0x1f
C++ code:
int I2CTools::write8(int value) {
union i2c_smbus_data data;
data.byte = value;
return i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_WRITE, 0x00, I2C_SMBUS_BYTE_DATA, &data);
}
int I2CTools::read8() {
union i2c_smbus_data data;
if (i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_READ, 0x00, I2C_SMBUS_BYTE_DATA, &data))
return -1;
else
return data.byte & 0xFF;
}
Now I suppose that I have to loop over the address like this:
root@sense4:~/i2c-tests# sudo i2cset -y 3 0x20 0x00 0x1f ; sudo i2cset -y 3 0x20 0x01 0x85 ; sudo i2cset -y 3 0x20 0x02 0xeb ; sudo i2cset -y 3 0x20 0x03 0x51 ; sudo i2cset -y 3 0x20 0x04 0xb8 ; sudo i2cset -y 3 0x20 0x05 0x1e ; sudo i2cset -y 3 0x20 0x06 0x09 ; sudo i2cset -y 3 0x20 0x07 0x40
root@sense4:~/i2c-tests# sudo i2cget -y 3 0x20 0x00 ;sudo i2cget -y 3 0x20 0x01 ; sudo i2cget -y 3 0x20 0x02 ; sudo i2cget -y 3 0x20 0x03 ; sudo i2cget -y 3 0x20 0x04 ; sudo i2cget -y 3 0x20 0x05 ; sudo i2cget -y 3 0x20 0x06 ; sudo i2cget -y 3 0x20 0x07
0x1f
0x85
0xeb
0x51
0xb8
0x1e
0x09
0x40
But in C++ of course... Is this make sense for you? I am newbie with i2c devices and I suppose it is this direction that I have to do in my code. Thanks!
int I2CTools::writeDouble(double value) {
union i2c_smbus_data data;
doubleToCharArray.original = value;
std::cout << "nBytes: ";
for (unsigned long address = 0; address < sizeof(double); address++) {
std::cout << (int) doubleToCharArray.output[address] << ' ';
data.byte = (int) doubleToCharArray.output[address];
// std::cout << hex(doubleToCharArray.output[address]) << ' ';
i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_WRITE, address, I2C_SMBUS_BYTE_DATA, &data);
}
return 0;
}
double I2CTools::readDouble() {
unsigned char charArray[sizeof(double)];
std::cout << "nBytes: ";
for (unsigned long address = 0; address < sizeof(double); address++) {
union i2c_smbus_data data;
if (i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_READ, address, I2C_SMBUS_BYTE_DATA, &data)) {
return -1;
} else {
std::cout << (int) data.byte << ' ';
charArray[address] = data.byte;
}
}
return *reinterpret_cast<double *>(charArray);
}
c++ raspberry-pi i2c
Have you tried using option "i" instead of "s"? You can also easily use bash or Python to implement it by calling i2cget directly
– Adashi
Nov 21 '18 at 9:58
add a comment |
When I try to use i2cset
on my raspberryPI with mode for SMBus block data
it is saying Error: Adapter does not have SMBus block write capability
.
# sudo i2cset -y 3 0x20 0x01 0xDE 0xAD 0xC0 0xDE 0x00 0xFF s
Error: Adapter does not have SMBus block write capability
I looked at the WiringPi code and it has 2 functions to write data on I2C. The first uses byte data and the second a word data. It is missing the (SMBus block data) and the (I2C block data). So I suppose that RaspberryPi's do not support it.
I want to implement a C++ code that write a double to the i2c on my raspberryPi. To write an int I am already doing.
root@sense4:~/i2c-tests# sudo i2cset -y 3 0x20 0x00 0x1f
root@sense4:~/i2c-tests# sudo i2cget -y 3 0x20 0x00
0x1f
C++ code:
int I2CTools::write8(int value) {
union i2c_smbus_data data;
data.byte = value;
return i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_WRITE, 0x00, I2C_SMBUS_BYTE_DATA, &data);
}
int I2CTools::read8() {
union i2c_smbus_data data;
if (i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_READ, 0x00, I2C_SMBUS_BYTE_DATA, &data))
return -1;
else
return data.byte & 0xFF;
}
Now I suppose that I have to loop over the address like this:
root@sense4:~/i2c-tests# sudo i2cset -y 3 0x20 0x00 0x1f ; sudo i2cset -y 3 0x20 0x01 0x85 ; sudo i2cset -y 3 0x20 0x02 0xeb ; sudo i2cset -y 3 0x20 0x03 0x51 ; sudo i2cset -y 3 0x20 0x04 0xb8 ; sudo i2cset -y 3 0x20 0x05 0x1e ; sudo i2cset -y 3 0x20 0x06 0x09 ; sudo i2cset -y 3 0x20 0x07 0x40
root@sense4:~/i2c-tests# sudo i2cget -y 3 0x20 0x00 ;sudo i2cget -y 3 0x20 0x01 ; sudo i2cget -y 3 0x20 0x02 ; sudo i2cget -y 3 0x20 0x03 ; sudo i2cget -y 3 0x20 0x04 ; sudo i2cget -y 3 0x20 0x05 ; sudo i2cget -y 3 0x20 0x06 ; sudo i2cget -y 3 0x20 0x07
0x1f
0x85
0xeb
0x51
0xb8
0x1e
0x09
0x40
But in C++ of course... Is this make sense for you? I am newbie with i2c devices and I suppose it is this direction that I have to do in my code. Thanks!
int I2CTools::writeDouble(double value) {
union i2c_smbus_data data;
doubleToCharArray.original = value;
std::cout << "nBytes: ";
for (unsigned long address = 0; address < sizeof(double); address++) {
std::cout << (int) doubleToCharArray.output[address] << ' ';
data.byte = (int) doubleToCharArray.output[address];
// std::cout << hex(doubleToCharArray.output[address]) << ' ';
i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_WRITE, address, I2C_SMBUS_BYTE_DATA, &data);
}
return 0;
}
double I2CTools::readDouble() {
unsigned char charArray[sizeof(double)];
std::cout << "nBytes: ";
for (unsigned long address = 0; address < sizeof(double); address++) {
union i2c_smbus_data data;
if (i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_READ, address, I2C_SMBUS_BYTE_DATA, &data)) {
return -1;
} else {
std::cout << (int) data.byte << ' ';
charArray[address] = data.byte;
}
}
return *reinterpret_cast<double *>(charArray);
}
c++ raspberry-pi i2c
When I try to use i2cset
on my raspberryPI with mode for SMBus block data
it is saying Error: Adapter does not have SMBus block write capability
.
# sudo i2cset -y 3 0x20 0x01 0xDE 0xAD 0xC0 0xDE 0x00 0xFF s
Error: Adapter does not have SMBus block write capability
I looked at the WiringPi code and it has 2 functions to write data on I2C. The first uses byte data and the second a word data. It is missing the (SMBus block data) and the (I2C block data). So I suppose that RaspberryPi's do not support it.
I want to implement a C++ code that write a double to the i2c on my raspberryPi. To write an int I am already doing.
root@sense4:~/i2c-tests# sudo i2cset -y 3 0x20 0x00 0x1f
root@sense4:~/i2c-tests# sudo i2cget -y 3 0x20 0x00
0x1f
C++ code:
int I2CTools::write8(int value) {
union i2c_smbus_data data;
data.byte = value;
return i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_WRITE, 0x00, I2C_SMBUS_BYTE_DATA, &data);
}
int I2CTools::read8() {
union i2c_smbus_data data;
if (i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_READ, 0x00, I2C_SMBUS_BYTE_DATA, &data))
return -1;
else
return data.byte & 0xFF;
}
Now I suppose that I have to loop over the address like this:
root@sense4:~/i2c-tests# sudo i2cset -y 3 0x20 0x00 0x1f ; sudo i2cset -y 3 0x20 0x01 0x85 ; sudo i2cset -y 3 0x20 0x02 0xeb ; sudo i2cset -y 3 0x20 0x03 0x51 ; sudo i2cset -y 3 0x20 0x04 0xb8 ; sudo i2cset -y 3 0x20 0x05 0x1e ; sudo i2cset -y 3 0x20 0x06 0x09 ; sudo i2cset -y 3 0x20 0x07 0x40
root@sense4:~/i2c-tests# sudo i2cget -y 3 0x20 0x00 ;sudo i2cget -y 3 0x20 0x01 ; sudo i2cget -y 3 0x20 0x02 ; sudo i2cget -y 3 0x20 0x03 ; sudo i2cget -y 3 0x20 0x04 ; sudo i2cget -y 3 0x20 0x05 ; sudo i2cget -y 3 0x20 0x06 ; sudo i2cget -y 3 0x20 0x07
0x1f
0x85
0xeb
0x51
0xb8
0x1e
0x09
0x40
But in C++ of course... Is this make sense for you? I am newbie with i2c devices and I suppose it is this direction that I have to do in my code. Thanks!
int I2CTools::writeDouble(double value) {
union i2c_smbus_data data;
doubleToCharArray.original = value;
std::cout << "nBytes: ";
for (unsigned long address = 0; address < sizeof(double); address++) {
std::cout << (int) doubleToCharArray.output[address] << ' ';
data.byte = (int) doubleToCharArray.output[address];
// std::cout << hex(doubleToCharArray.output[address]) << ' ';
i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_WRITE, address, I2C_SMBUS_BYTE_DATA, &data);
}
return 0;
}
double I2CTools::readDouble() {
unsigned char charArray[sizeof(double)];
std::cout << "nBytes: ";
for (unsigned long address = 0; address < sizeof(double); address++) {
union i2c_smbus_data data;
if (i2c_smbus_access(i2cFileDescriptor, I2C_SMBUS_READ, address, I2C_SMBUS_BYTE_DATA, &data)) {
return -1;
} else {
std::cout << (int) data.byte << ' ';
charArray[address] = data.byte;
}
}
return *reinterpret_cast<double *>(charArray);
}
c++ raspberry-pi i2c
c++ raspberry-pi i2c
asked Nov 14 '18 at 11:18
Felipe Oliveira GutierrezFelipe Oliveira Gutierrez
98921228
98921228
Have you tried using option "i" instead of "s"? You can also easily use bash or Python to implement it by calling i2cget directly
– Adashi
Nov 21 '18 at 9:58
add a comment |
Have you tried using option "i" instead of "s"? You can also easily use bash or Python to implement it by calling i2cget directly
– Adashi
Nov 21 '18 at 9:58
Have you tried using option "i" instead of "s"? You can also easily use bash or Python to implement it by calling i2cget directly
– Adashi
Nov 21 '18 at 9:58
Have you tried using option "i" instead of "s"? You can also easily use bash or Python to implement it by calling i2cget directly
– Adashi
Nov 21 '18 at 9:58
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53298980%2fwriting-a-double-to-i2c-device%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53298980%2fwriting-a-double-to-i2c-device%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Have you tried using option "i" instead of "s"? You can also easily use bash or Python to implement it by calling i2cget directly
– Adashi
Nov 21 '18 at 9:58