Jump to content

    
Sign in to follow this  
MementoMori

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

Recommended Posts

Вот такой вот 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? Может я не ту функцию выбрал?

Share this post


Link to post
Share on other sites
10 часов назад, MementoMori сказал:

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

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

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

Share this post


Link to post
Share on other sites
56 minutes ago, HardEgor said:

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

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

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

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

Адрес

Адрес

Байт1

Байт2

Байт3? 

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

 

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

Share this post


Link to post
Share on other sites
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 не выдадут и дальнейшие данные не примут.

Share this post


Link to post
Share on other sites
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

 

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

Share this post


Link to post
Share on other sites
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 инициализируете?

Share this post


Link to post
Share on other sites
10 часов назад, MementoMori сказал:

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

PUf9sFGO.png?download=1

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

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

 

Share this post


Link to post
Share on other sites
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 указывать адрес регистра? Я правильно понял?


 

Share this post


Link to post
Share on other sites
33 минуты назад, MementoMori сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
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).

 

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

Share this post


Link to post
Share on other sites
30 минут назад, MementoMori сказал:

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Что я сделал - я тупо пишу 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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this