Перейти к содержанию
    

Помогите разобраться с i2c микросхемой.

Вот такой вот i2C ЦАП   https://www.ti.com/lit/ds/symlink/dac43608.pdf

Вот что в даташите про протокол написано

2JQlzqyo.png?download=1

 

То есть, шлем адрес, дальше тип команды (например номер канала), дальше данные (например значение напряжения на канале).

И вот функция, которую предоставляет куб

HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

Я не совсем пойму. Как в этом случае будет выглядеть протокол обмена?  

Вот так что ли?

ADDRES BYTE
  ACK
байт в pData
  .....

Получается что этой функцией можно только чередовать адрес и данные в посылке, а у меня адрес->команда->данные.

Подскажите, как организовать обмен с этой микросхемой посредством HAL? Может я не ту функцию выбрал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, MementoMori сказал:

Получается что этой функцией можно только чередовать адрес и данные в посылке, а у меня адрес->команда->данные.

Подскажите, как организовать обмен с этой микросхемой посредством HAL? Может я не ту функцию выбрал?

Вам надо передать 4 байта, первый из которых адрес(DevAddress), а три других - данные(pData). Ну так и передавайте :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 minutes ago, HardEgor said:

первый из которых адрес(DevAddress)

То есть по адресу 0х48 микросхем пересылается её же адрес? 

Извините, может я неправильно понимаю процесс. Мастер шлёт в сеть адрес, микросхема откликается ACK,  это значит, что следующая посылка будет воспринять ей как руководство к действию, а остальные микросхемы, не распознавшие свой адрес, будут спать.

Если я вызову вышеуказанную функцию отправки, получится, что она пошлёт следующую посылку

Адрес

Адрес

Байт1

Байт2

Байт3? 

Или же мне нужно отправить буфер из 2,3,4 байт, а в первый будет поставлен DevAddress? 

 

Не сочтите за наглость, вас не затруднит показать, как вызывать функцию и как будет выглядеть посылка? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, MementoMori сказал:

Извините, может я неправильно понимаю процесс. Мастер шлёт в сеть адрес, микросхема откликается ACK,  это значит, что следующая посылка будет воспринять ей как руководство к действию, а остальные микросхемы, не распознавшие свой адрес, будут спать.

Так исходник функции откройте - там всё написано.

DevAddress = Address;

pData[0] = Command_byte;

pData[1] = MSDB;

pData[2] = LSDB;

HAL_I2C_Master_Transmit(hi2c, DevAddress, pData, 3, Timeout)

Остальные микросхемы спать не будут, они тоже воспримут адрес, но ACK не выдадут и дальнейшие данные не примут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, HardEgor said:

Так исходник функции откройте - там всё написано.

DevAddress = Address;

pData[0] = Command_byte;

pData[1] = MSDB;

pData[2] = LSDB;

HAL_I2C_Master_Transmit(hi2c, DevAddress, pData, 3, Timeout)

Остальные микросхемы спать не будут, они тоже воспримут адрес, но ACK не выдадут и дальнейшие данные не примут.

Спасибо, Теперь пытаюсь читать:

 

PUf9sFGO.png?download=1

 

Хочу прочитать STATUS_REGISTER, для его чтения COMMAND_BYTE должен быть равен 0x02

 

Читаю

	uint8_t aRxBuffer[3];

	Command_byte = 0x02;
	aRxBuffer[0] = Command_byte;

	HAL_I2C_Master_Receive(&hi2c1, DevAddress, aRxBuffer, 3, 100);	

 

Пoлучаю aRxBuffer 0x00,0x00,0xFF

 

Лажа какая-то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А скажите мне, ведь эти HAL-библиотеки под STM32? А что делать с ними, если платформу придётся менять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я любитель и STM мне за глаза.

uint8_t MemAddress=0x02;
uint8_t MemAddressSize=2;
	
	
HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress,MemAddressSize, aRxBuffer, 2, 100);	

И вот так тоже нули...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, Herz сказал:

А скажите мне, ведь эти HAL-библиотеки под STM32? А что делать с ними, если платформу придётся менять?

Переходить на другие библиотеки :) И хорошо если будут исходники....

 

10 часов назад, MementoMori сказал:

 


	uint8_t aRxBuffer[3];

	Command_byte = 0x02;
	aRxBuffer[0] = Command_byte;

	HAL_I2C_Master_Receive(&hi2c1, DevAddress, aRxBuffer, 3, 100);	

 

Насколько я помню функция должна что-то возвращать - закончила нормально или по таймауту?

И проверить hi2c->ErrorCode

А остальные значения aRxBuffer инициализируете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, MementoMori сказал:

Спасибо, Теперь пытаюсь читать:

PUf9sFGO.png?download=1

Дык, однако, там же нарисовано -  вначале надо сделать Transmit команды, а потом Receive данных.

Т.е. вначаде HAL_I2C_Master_Transmit(), а потом HAL_I2C_Master_Receive() и после выполнения каждой проверять на ошибки.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

57 minutes ago, HardEgor said:

Насколько я помню функция должна что-то возвращать - закончила нормально или по таймауту?

И проверить hi2c->ErrorCode

Без ошибок.

57 minutes ago, HardEgor said:

А остальные значения aRxBuffer инициализируете?

судя по исходному коду функции Receive,  она сама туда пишет.

 

35 minutes ago, HardEgor said:

Т.е. вначаде HAL_I2C_Master_Transmit(), а потом HAL_I2C_Master_Receive() и после выполнения каждой проверять на ошибки.

Вот черт, я ведь так и подумал в начале. Даже на форуме написал, а потом решил, что это глупость, и стер. Я решил, что функция HAL_I2C_Mem_Read делает все сама.

Так в Transmit в поле address_byte указывать адрес устройства, а в Recieve в поле address_byte указывать адрес регистра? Я правильно понял?


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 минуты назад, MementoMori сказал:

Так в Transmit в поле address_byte указывать адрес устройства, а в Recieve в поле address_byte указывать адрес регистра? Я правильно понял?

Почему? Вы хорошо посмотрели на картинку? Там же всё нарисовано:

1. посылаете address и command

2. посылаете address и получаете 2 байта(device_config и status/trigger).

зы. чтение lдокументации 100$/час

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, HardEgor said:

Вы хорошо посмотрели на картинку? Там же всё нарисовано:

 

Да картинка мне понятна, не совсем понятно, как функциями это реализлвывать

18 minutes ago, HardEgor said:

посылаете address и command

Это ясно, HAL_I2C_Master_Transmit() и буфер размером в 1 байт. 

20 minutes ago, HardEgor said:

посылаете address и получаете 2 байта(device_config и status/trigger).

Посылаю как? Ещё одна функция transmit()? 

Или HAL_I2C_Master_Receive(), а она сама пошлёт байт адреса? 

В этой функции в качестве параметра есть rxBuffer. Его элементам ничего присваивать не надо, функция сама его заполнит? Так? 

23 minutes ago, HardEgor said:

посылаете address и получаете 2 байта(device_config и status/trigger).

 

Неправда ваша. Каждый из указанных регистров двухбайтный и читается по отдельности. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 минут назад, MementoMori сказал:

Или HAL_I2C_Master_Receive(), а она сама пошлёт байт адреса? 

В этой функции в качестве параметра есть rxBuffer. Его элементам ничего присваивать не надо, функция сама его заполнит? Так?

Да, пошлёт адрес и примет 2 байта. А как она еще может обратиться к чипу? Смотрите исходник - там всё написано.

30 минут назад, MementoMori сказал:

Неправда ваша. Каждый из указанных регистров двухбайтный и читается по отдельности. 

В даташит не вникал, но на вашей картинке явно написано MSDB и LSDB, и также в таблицах 5 и 8 написано, а также в Read Sequence.

ps. напоминаю - чтение документации вслух 100$/час :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, получилось, чтение и запись работают.  

Но.... не во все регистры пишется.

Что я сделал - я тупо пишу 0xFFFF во все регистры.  Номер регистра это Conand_byte.

По идее я должен прочесть из них те же 0xFFFF, за минусом тех бит, которые Readonly или "Don't care"

 

	Command_byte = 0x01;
	
    DAC_REGISTER=0XFFFF;
	LSDB=DAC_REGISTER>>8;
	MSDB=DAC_REGISTER&0xFF;
		aTxBuffer[0] = Command_byte;
		aTxBuffer[1] = MSDB;
		aTxBuffer[2] = LSDB;
		HAL_I2C_Master_Transmit(&hi2c1, DevAddress, aTxBuffer, 3, 100);	
	
	Command_byte = 0x01;
	aTxBuffer[0] = Command_byte;
	RESULT=HAL_I2C_Master_Transmit(&hi2c1, DevAddress, aTxBuffer, 1, 100);	
	RESULT2=HAL_I2C_Master_Receive(&hi2c1, DevAddress, aRxBuffer, 2, 100);	

 

К примеру

kibkT0s6.png?download=1

Запись в этот регистр 0xFFFF при чтении дает 0x0FFF.

Отлично, идем дальше 

mANvU5GR.png?download=1

Запись в этот регистр 0xFFFF при чтении дает 0x0500 (в серединке читается DEVICE_ID, который в бинарном формате 010100).

 

А вот регистры каналов

BpbHxvTh.png?download=1

 

Что бы я ни записал - читаются нули....  что может быть не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...