Этот пример шоу, как написать и прочитать данные из ADXL345 I2C, позволил чип акселерометра, используя адаптер USB 8451 I2C NI. Акселерометр будет сконфигурирован для обнаружения двойного отвода, и MATLAB будет использоваться для отображения сообщения о том, что микросхема обнаружила это.
Toolbox™ управления приборами поддерживает связь с приборами через интерфейсы и драйверы.
Дополнительные сведения о панели инструментов см. на странице продукта Панель инструментов управления приборами.
В этом примере требуется установка системы Microsoft ® Windows ® и драйвера NI845x версии 2.1.1 или выше. Перед использованием этого примера убедитесь, что обозреватель измерений и автоматизации распознает NI845x устройство. Кроме того, перед доступом к форме устройства MATLAB убедитесь, что Explorer™ измерения и автоматизации закрыт.
В этом примере используется акселерометр Analog Devices ® ADXL345, установленный на 9DOF Sensor Stick от SparkFun™. Акселерометр имеет I2C шин, которые могут быть подключены к переходникам I2C входам шин. Линии шины должны быть подняты на высоту с помощью внешних растягивающих резисторов, так как NI USB 8451 не имеет программируемых внутренних растягивающих резисторов. Следует отметить, что для разделения V_s и V_dd используется уровнемер.

Toolbox™ управления приборами поддерживает связь с I2C устройствами через адаптеры I2C, такие как NI USB 8451. Панель инструментов позволяет создать интерфейс I2C, который можно использовать для настройки адаптера для взаимодействия с I2C периферийными микросхемами.
В этом примере показано, как настроить акселерометр на основе I2C так, чтобы он реагировал на два удара пальцем по доске. При обнаружении двойного касания в окне команд MATLAB появится соответствующее сообщение.
Используйте instrhwinfo для проверки правильности установки драйвера NI845x и того, что инструментарий управления приборами может правильно его обнаружить.
Серийный номер платы должен помочь идентифицировать устройство
instrreset i2cInfo = instrhwinfo ('i2c', 'ni845x'); disp(i2cInfo);
AdaptorDllName: [1x94 char]
AdaptorDllVersion: 'Version 3.4'
AdaptorName: 'ni845x'
BoardIdsInUse: [1x0 double]
InstalledBoardIDs: 0
DetectedBoardSerials: {'0180D47A (BoardIndex: 0)'}
ObjectConstructorName: 'i2c('ni845x', BoardIndex, RemoteAddress);'
VendorDllName: 'Ni845x.dll'
VendorDriverDescription: 'National Instruments NI USB 845x Driver'
accelerometerAddress = hex2dec('53'); i2cInterface = i2c('ni845x', 0, accelerometerAddress); fopen(i2cInterface); i2cInterface.BitRate = 100;
Установите значения регистра в соответствии со спецификацией устройства. Прочитайте значение с устройства, чтобы убедиться, что оно действительно установлено.
threshTapRegisterAddress = hex2dec('1D'); valueToWrite = hex2dec('50'); %5g value disp(['Writing Value: ' num2str(valueToWrite)]); fwrite(i2cInterface, [threshTapRegisterAddress valueToWrite]); fwrite(i2cInterface, threshTapRegisterAddress); registerValue = fread(i2cInterface, 1, 'uint8'); disp(['The value of the THRESH_TAP register is :' num2str(registerValue)]); latentRegisterAddress = hex2dec('22'); valueToWrite = hex2dec('5'); disp(['Writing Value: ' num2str(valueToWrite)]); fwrite(i2cInterface, [latentRegisterAddress valueToWrite]); % Confirm the value return to the register fwrite(i2cInterface, latentRegisterAddress); registerValue = fread(i2cInterface, 1, 'uint8'); disp(['The value of the LATENT register is :' num2str(registerValue)]); windowRegisterAddress = hex2dec('23'); valueToWrite = hex2dec('FF'); disp(['Writing Value: ' num2str(valueToWrite)]); fwrite(i2cInterface, [windowRegisterAddress valueToWrite]); % Confirm the value return to the register fwrite(i2cInterface, windowRegisterAddress); registerValue = fread(i2cInterface, 1, 'uint8'); disp(['The value of the WINDOW register is :' num2str(registerValue)]); durationRegisterAddress = hex2dec('21'); valueToWrite = hex2dec('10'); disp(['Writing Value: ' num2str(valueToWrite)]); fwrite(i2cInterface, [durationRegisterAddress valueToWrite]); fwrite(i2cInterface, durationRegisterAddress); registerValue = fread(i2cInterface, 1, 'uint8'); disp(['The value of the DUR register is :' num2str(registerValue)]); tapAxesRegisterAddress = hex2dec('2A'); valueToWrite = bin2dec('00000111'); disp(['Writing Value: ' num2str(valueToWrite)]); fwrite(i2cInterface, [tapAxesRegisterAddress valueToWrite]); fwrite(i2cInterface, tapAxesRegisterAddress); registerValue = fread(i2cInterface, 1, 'uint8'); disp(['The value of the TAP_AXES register is :' num2str(registerValue)]); interruptEnableRegisterAddress = hex2dec('2E'); valueToWrite = bin2dec('01100000'); disp(['Writing Value: ' num2str(valueToWrite)]); fwrite(i2cInterface, [interruptEnableRegisterAddress valueToWrite]); fwrite(i2cInterface, interruptEnableRegisterAddress); registerValue = fread(i2cInterface, 1, 'uint8'); disp(['The value of the INT_ENABLE register is :' num2str(registerValue)]);
Writing Value: 80 The value of the THRESH_TAP register is :80 Writing Value: 5 The value of the LATENT register is :5 Writing Value: 255 The value of the WINDOW register is :255 Writing Value: 16 The value of the DUR register is :16 Writing Value: 7 The value of the TAP_AXES register is :7 Writing Value: 96 The value of the INT_ENABLE register is :96
Запись в регистр POWER_CTL согласно спецификации приведет к переходу микросхемы из режима ожидания в режим нормальной эксплуатации.
powerControlRegisterAddress = hex2dec('2D'); valueToWrite = bin2dec('00001000'); disp(['Writing Value: ' num2str(valueToWrite)]); fwrite(i2cInterface, [powerControlRegisterAddress valueToWrite]); fwrite(i2cInterface, powerControlRegisterAddress); registerValue = fread(i2cInterface, 1, 'uint8'); disp(['The value of the POWER_CTL register is :' num2str(registerValue)]);
Writing Value: 8 The value of the POWER_CTL register is :8
Регистр источника прерывания будет содержать биты, которые соответствуют флагам прерывания, генерируемым конкретными источниками. Проверьте, что создано прерывание с двойным отводом
interruptSourceRegisterAddress = hex2dec('30'); disp('Waiting for double tap...'); while(1) fwrite(i2cInterface, interruptSourceRegisterAddress); InterruptValues = fread(i2cInterface, 1); TapInterrupt = bitand(InterruptValues, bin2dec('00100000')); if TapInterrupt disp('Double tap detected!'); break; end end
Waiting for double tap... Double tap detected!