Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



запись двух байт в регистр по i2c

Сообщений 1 страница 8 из 8

1

Привет всем!

Подскажите пожалуйста как записать два байта (старший и младший) в регистр по шине i2c с помощью команды i2cwbyte. Ковыряюсь с тачскрин-контроллером TSC2004.

В хелпе баскома нашел следующий код:

Код:
' when you want to control a chip with a larger memory like the 24c64 it requires an additional byte

' to be sent (consult the datasheet):

' Wires from the I2C address that are not connected will default to 0 in most cases!

 

'   I2cstart                                                'start condition

'   I2cwbyte &B1010_0000                                    'slave address

'   I2cwbyte H                                              'high address

'   I2cwbyte L                                              'low address

'   I2cwbyte Value                                          'value to write

'   I2cstop                                                 'stop condition

'   Waitms 10

Но я так панимаю, что это запись в шестнадцатеричный регистр одного байта, а не запись двух байт по восмеричному (7+1 R/W byte) адресу.

Ниже  (изображение) приведен алгоритм записи из даташита:
http://uploads.ru/t/X/g/d/Xgd1C.png

П.С команду I2CSEND никогда не применял, возможно она единственный вариант? что скажете?

0

2

не помню точно, было давно, но, кажется,  этой микросхеме нужно посылать пять байт

0

3

dmm? ты работал с этим контроллером?? Или одним из этих -ADS7843, ADS7845, ADS7846, TSC2003, TSC2004, TSC2005, TSC2006, TSC2007, TSC2046

Буду очень признателен, если поделишься кодом)

0

4

Суть в чем, чтобы включить режим мультипередачи, то старший бит в команде действия должен выставляться (&B10000000).

Пример чтения данных из гироскопа:

Код:
   I2cstart
   I2cwbyte L3g4200d_w
   I2cwbyte &B10100110                                      ' OUT_TEMP + Multi Read (&B10000000)
   I2cstart
   I2cwbyte L3g4200d_r
   I2crbyte Gtemp , Ack
   I2crbyte Gyro_status , Ack
   I2crbyte Gxl , Ack
   I2crbyte Gxh , Ack
   I2crbyte Gyl , Ack
   I2crbyte Gyh , Ack
   I2crbyte Gzl , Ack
   I2crbyte Gzh , Nack
   I2cstop

Думаю объяснять, что такое "Ack" и "Nack" не нужно?
Строка "I2cwbyte &B10100110", здесь:

-"&Bх0100110" - это OUT_TEMP;
- а "&B1ххххххх" - это режим мультичтения, который сокрощает значительно код записи/чтения по шине.

0

5

Для чтения это прекрасно подходит, не спорю, при том, что для этого же гироскопа (L3G4200D) писал когда-то. Код идентичный для практических всех гироскопов от STM. Но мне необходимо правильно записывать в регистр таскрин контроллера, а не читать их (регистры) последовательно, т.к с этим то проблем нет

Отредактировано nooby (2012-06-20 22:05:38)

0

6

А есть разница на чтение и запись? Я думал она аналогичная.

0

7

Да, оказывается аналогичная, только без Ack, Nack).

Код работает:

Код:
I2cstart #4
I2cwbyte write_register, #4
I2cwbyte &H00, #4                     'address register                       
I2cwbyte &B00000000 , #4          'MSB                        
I2cwbyte &B00000000 , #4          'LSB                          
I2cstop #4
Waitms 5

0

8

Спасибо за исследованные, будет полезно.

0