I2C
Navigation: Programming with ADLX → ADLX Samples → C++ Samples → I2C
Demonstrates how to read and write data with I2C when programming with ADLX.
Command Prompts
| Command Prompt | Description |
|---|---|
| 1 | Display version. |
| 2 | Read. |
| 3 | Repeated read. |
| 4 | Write. |
| M/m | Display the command prompt menu. |
| Q/q | Terminate the application. |
Sample Path
/Samples/CPP/I2C/I2C
C++
Code
C++
//// Copyright Advanced Micro Devices, Inc. All rights reserved.////-------------------------------------------------------------------------------------------------
/// \file mainI2C.cpp/// \brief Demonstrates how to read and write data with I2C when programming with ADLX.
#include "SDK/ADLXHelper/Windows/Cpp/ADLXHelper.h"#include "SDK/Include/II2C.h"#include <iostream>
// Use ADLX namespaceusing namespace adlx;
// ADLXHelper instance// No outstanding interfaces from ADLX must exist when ADLX is destroyed.// Use global variables to ensure validity of the interface.static ADLXHelper g_ADLXHelp;constexpr int DATA_SIZE = 2;
// Display versionvoid ShowVersion(const IADLXI2CPtr& i2c);
// Readvoid Read(const IADLXI2CPtr& i2c);
// Repeated readvoid RepeatedRead(const IADLXI2CPtr& i2c);
// Writevoid Write(const IADLXI2CPtr& i2c);
// Capabilityvoid Capability(const IADLXI2CPtr& i2c);
// Menuvoid MainMenu();
// Menu controlvoid MenuControl(const IADLXI2CPtr& i2c);
// Wait for exit with error messageint WaitAndExit(const char* msg, const int retCode);
int main(){ // Define return code ADLX_RESULT res = ADLX_FAIL;
// Initialize ADLX res = g_ADLXHelp.Initialize(); if (ADLX_SUCCEEDED(res)) { // GetGPUs IADLXGPUListPtr gpus; res = g_ADLXHelp.GetSystemServices()->GetGPUs(&gpus);
if (ADLX_SUCCEEDED(res) && !gpus->Empty()) { // Get GPU interface IADLXGPUPtr gpuInfo; adlx_uint index = 0; res = gpus->At(index, &gpuInfo);
// Get I2C interface IADLXI2CPtr i2c; res = g_ADLXHelp.GetSystemServices()->GetI2C(gpuInfo, &i2c); if (ADLX_SUCCEEDED(res)) { MainMenu(); MenuControl(i2c); } } else { std::cout << "Failed to get the GPU list: " << res << std::endl; } } else { return WaitAndExit("ADLX initialization failed", 0); }
// Destroy ADLX res = g_ADLXHelp.Terminate(); std::cout << "Destroy ADLX res: " << res << std::endl;
// Pause to see the print out system("pause");
return 0;}
void ShowVersion(const IADLXI2CPtr& i2c){ adlx_int major; adlx_int minor; ADLX_RESULT res = i2c->Version(&major, &minor); std::cout << "\tI2C version, major: " << major << " , minor: " << minor << std::endl; std::cout << "\tres is: " << res << std::endl;}
void Read(const IADLXI2CPtr& i2c){ // The following is hardware specific adlx_byte data[DATA_SIZE] = { 0 }; ADLX_RESULT res = i2c->Read(I2C_LINE_OEM2, 100, 0x93, 0x30, DATA_SIZE, data); std::cout << "\tI2C read info:\n" << "\t\tline: I2C_LINE_OEM2\n\t\tspeed: 100\n\t\taddress: 0x93\n\t\toffset: 0x30\n\t\tdataSize: " << DATA_SIZE << "\n\t\tdata: " << (int)data[0] << std::endl; std::cout << "\tres is: " << res << std::endl;}
void RepeatedRead(const IADLXI2CPtr& i2c){ // The following is hardware specific adlx_byte data[DATA_SIZE] = { 0 }; ADLX_RESULT res = i2c->RepeatedStartRead(I2C_LINE_OEM2, 100, 0x93, 0x30, DATA_SIZE, data); std::cout << "\tI2C read info:\n" << "\t\tline: I2C_LINE_OEM2\n\t\tspeed: 100\n\t\taddress: 0x93\n\t\toffset: 0x30\n\t\tdataSize: " << DATA_SIZE << "\n\t\tdata: " << (int)data[0] << std::endl; std::cout << "\tres is: " << res << std::endl;}
void Write(const IADLXI2CPtr& i2c){ // The following is hardware specific adlx_byte data[DATA_SIZE] = { 0 }; data[0] = 176; ADLX_RESULT res = i2c->Write(I2C_LINE_OEM2, 100, 0x93, 0x30, DATA_SIZE, data); std::cout << "\tI2C write info:\n" << "\t\tline: I2C_LINE_OEM2\n\t\tspeed: 100\n\t\taddress: 0x93\n\t\toffset: 0x30\n\t\tdataSize: " << DATA_SIZE << "\n\t\tdata: " << (int)data[0] << std::endl; std::cout << "\tres is: " << res << std::endl;}
void Capability(const IADLXI2CPtr& i2c){ adlx_bool isSupported = false; ADLX_RESULT res = i2c->IsSupported(I2C_LINE_OEM2, 0x93, &isSupported); std::cout << "\tI2C support info:\n" << "\t\tline: I2C_LINE_OEM2\n\t\taddress: 0x93\n\t\tisSupported: " << isSupported << "\n\tres is: " << res << std::endl;}
void MainMenu(){ std::cout << "\tChoose one from the following options" << std::endl;
std::cout << "\t->Press 1 to display version" << std::endl; std::cout << "\t->Press 2 to read" << std::endl; std::cout << "\t->Press 3 to repeated read" << std::endl; std::cout << "\t->Press 4 to write" << std::endl; std::cout << "\t->Press 5 to display capability" << std::endl;
std::cout << "\t->Press Q/q to terminate the application" << std::endl; std::cout << "\t->Press M/m to display main menu options" << std::endl;}
void MenuControl(const IADLXI2CPtr& i2c){ int num = 0; while ((num = getchar()) != 'q' && num != 'Q') { switch (num) { // Display version case '1': ShowVersion(i2c); break;
// Read case '2': Read(i2c); break;
// Repeated read case '3': RepeatedRead(i2c); break;
// Write case '4': Write(i2c); break;
// Capability case '5': Capability(i2c); break;
// Display main menu options case 'm': case 'M': MainMenu(); break; default: break; } }}
// Wait for exit with error messageint WaitAndExit(const char* msg, const int retCode){ // Printout the message and pause to see it before returning the desired code if (nullptr != msg) std::cout << msg << std::endl;
system("pause"); return retCode;}