Контрольный байт для связи с акселерометром MMA7455L
|
|
somlich |
Дата: Вт, 07.08.2012, 07:40 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 23.02.2009
Статус:
Offline
|
Связь идет по I2C, в командах I2cread и I2cwrite после dpin,cpin идет некий контрольный байт control. Если для связи с внешней памяти я использовал байт %10100000 (с учебника) все работало прекрасно. А тут никак, как узнать контрольный байт для чтения и записи для этого устройства. Даташит читал, но не нашел.
|
|
|
|
DAlexV |
Дата: Вт, 07.08.2012, 09:38 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (somlich) А тут никак, как узнать контрольный байт для чтения и записи для этого устройства. Даташит читал, но не нашел. стр 23. Регистр $0D: I2C Device Address (Bit 6-0: Read only, Bit 7: Read/Write) % 0011101 Default
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
somlich |
Дата: Чт, 16.08.2012, 22:56 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 23.02.2009
Статус:
Offline
|
Quote (DAlexV) стр 23. Регистр $0D: I2C Device Address (Bit 6-0: Read only, Bit 7: Read/Write) % 0011101 Default Спс. Буду пробовать.Добавлено (16.08.2012, 22:56) --------------------------------------------- Испортил уже два акселерометра, думал не пропаял все таки тяжелый корпус. Третий уже аккуратно тонкими про водочками к каждому контакту и этого ежика на плату, так что непропай исключен. Подключил все как по даташиту. 1, 4, 6, 7 к 3.3В. 2,5 - GND. 13 - Data, 14 - Clock. (конденсаторы по питанию стоят, сопротивления 4,7К на подтяжку I2C стоят) Процессор F18F2550, питание 3.3В (линейный стабилизатор с +5В от USB). B0 (DPIN) к линии Data акселя, B1 (CPIN) к линии Clock. Кнопки соответственно к B2-B5. USB настроен как HID джойстик, система его видит, кнопки работают, в калибровке отображаются. А вот оси x и y на значении 1 обе так и висят вне зависимости от поворота акселя. В общем я уже и не знаю что делать. Уже две недели недели мучаюся...
Code
Define OSC 20
DPIN var PORTB.0 CPIN var PORTB.1
bt1 VAR PORTB.2 TRISB.2 = 1 bt2 VAR PORTB.3 TRISB.3 = 1 bt3 VAR PORTB.4 TRISB.4 = 1 bt4 VAR PORTB.5 TRISB.5 = 1 Buttons VAR byte x VAR byte y VAR byte
'USB buffer Var Byte[3] USBInit
' 2G - %101 $05
I2cwrite dpin,cpin,$1D,$16,[$05]
main: I2cread dpin,cpin,$1D,$06,[x] I2cread dpin,cpin,$1D,$07,[y] buffer[0] = x buffer[1] = y if bt1 = 1 then buttons.bit0 = 1 else buttons.bit0 = 0 endif if bt2 = 1 then buttons.bit1 = 1 else buttons.bit1 = 0 endif if bt2 = 1 then buttons.bit2 = 1 else buttons.bit2 = 0 endif if bt3 = 1 then buttons.bit3 = 1 else buttons.bit3 = 0 endif
buffer[2] = buttons USBService USBOut 1, buffer, 3, main
GOTO main
Вот и что делать, даже не представляю. Помогите кто чем может.
|
|
|
|
DAlexV |
Дата: Пт, 17.08.2012, 00:10 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Советую внимательно прочитать страницу 17 (протокол обмена), а именно так называемый ответ от устройства (ACK) и повторный старт (SR). Если протокол обмена нарушить, то ответа от устройства не будет. Можно потренироваться сначала в Протеусе над чтением (записью) любой микрухи с интрефейсом I2C (24LC128 например). А после уже переложить работающий код на MMA7455L. Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал
DAlexV - Пт, 17.08.2012, 10:17
|
|
|
|
somlich |
Дата: Пт, 17.08.2012, 11:29 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 23.02.2009
Статус:
Offline
|
С обычной внешней памятью я работал, там все нормально. Я вот думаю может причина в том, что МК и акселерометр работают на 3.3В а логика USB на 5В. Даже не знаю. В МК подключено все к железному I2C. Вот же засада то. Даташит прочитал, но ведь PicBasic при компиляции использует свой протокол, и судя по всем у внешней EEprom по I2C проблем нет.
|
|
|
|
DAlexV |
Дата: Пт, 17.08.2012, 11:38 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (somlich) PicBasic при компиляции использует свой протокол I2C он везде стандартный, но обращение к разным микрухам может быть организованно по разному. Одной не требуется подтверждение ответа(Slave->Master), другой это условие обязательно(из за внутренней занятости). Хотелось бы посмотреть схемку и полный код.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
somlich |
Дата: Пт, 17.08.2012, 12:46 | Сообщение # 7 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 23.02.2009
Статус:
Offline
|
Код полный представил выше.
Вот схема, аксель питается теми же 3.3V что и МК
|
|
|
|
somlich |
Дата: Пт, 17.08.2012, 12:50 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 23.02.2009
Статус:
Offline
|
Вот прикладываю архив всех файлов проекта. Собственно проект 18F2550_Gamepad.BAS
|
|
|
|
DAlexV |
Дата: Пт, 17.08.2012, 14:47 | Сообщение # 9 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Судя по схеме, это попытка переделки вот этого проекта Загнал hex в Протеус. I2C отладчик кажет что не проверяется условие ACK, что и требовалось доказать. Берем кусок мануала на MMA7455L SINGLE BYTE WRITE To start a write command, the Master transmits a start condition (ST) to the MMA7455L, slave address ($1D) with the R/W bit set to “0” for a write, the MMA7455L sends an acknowledgement. Then the Master (MCU) transmits the 8-bit address of the register to write to, and the MMA7455L sends an acknowledgement. Then the Master (or MCU) transmits the 8-bit data to write to the designated register and the MMA7455L sends an acknowledgement that it has received the data. Since this transmission is complete, the Master transmits a stop condition (SP) to the data transfer. The data sent to the MMA7455L is now stored in the appropriate register. Теперь по нашему:
Запись одного байта
мастер отправляет в МАХ стартовую последовательность(ST) адрес устройства ($1D) (бит записи установить в 0-запись) MMA7455L подтверждает запись (ACK) мастер отправляет в МАХ 8-бит адреса регистра для записи MMA7455L подтверждает запись (ACK) мастер отправляет в МАХ 8-бит данных для записи MMA7455L подтверждает запись (ACK) на этом процедура записи одного байта завершена мастер отправляет условие стоп (ST) подтверждая окончание передачи
Теперь картинка Красным отмечено NotACK (нет ответа)
Для сравнения кусок мануала про 24lc128 то же самое, после записи каждого байта обязательно ACK Надеюсь доходчиво объяснил проблему. Удачи
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал
DAlexV - Пт, 17.08.2012, 14:48
|
|
|
|
somlich |
Дата: Пт, 17.08.2012, 17:06 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 23.02.2009
Статус:
Offline
|
Quote (DAlexV) Судя по схеме, это попытка переделки вот этого проекта ага Quote (DAlexV) Загнал hex в Протеус хм, а я в протеусе (7 Pro) не нашел mma7455. Quote (DAlexV) то же самое, после записи каждого байта обязательно ACK Это понятно, но я так понимаю что через команду I2CWrite это не осуществимо. Хотя вот есть цитата из знаменитой книги Хилинского про описание шины i2c Quote Пересылка каждого байта данных должна завершиться сигналом подтверждения приема; Свой протокол тогда изобретать что ли?Добавлено (17.08.2012, 17:06) --------------------------------------------- А можно скинуть проект протеуса где был получена картинка? А то я с ним если честно не особо дружен (с протеусом).
|
|
|
|
DAlexV |
Дата: Пт, 17.08.2012, 18:39 | Сообщение # 11 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (somlich) Это понятно, но я так понимаю что через команду I2CWrite это не осуществимо Да нет, возможно все, вопрос какими силами. Quote (somlich) Хотя вот есть цитата из знаменитой книги Хилинского про описание шины i2c Пересылка каждого байта данных должна завершиться сигналом подтверждения приема; У нас и на заборе то же пишут, а на самом желе там дрова лежат (надеюсь шутка уместна) В PBP куча подводных камней, и по удобству написания он уступает. Закончил работу с ним когда дело дошло до работы с прерываниями. Quote (somlich) А можно скинуть проект протеуса где был получена картинка? А то я с ним если честно не особо дружен (с протеусом). Да пожалуйста, приклеил, только советую отрезать USB из схемы. Иначе комп по страшному тормозит. + добавил стандартный пример на другом языке (Рыбе) где все как положено происходит.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
somlich |
Дата: Пт, 17.08.2012, 19:13 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 23.02.2009
Статус:
Offline
|
В общем если обращаться к внешней EEPROM по I2C и использовать адрес не $1d как у меня а стандартный адрес $A0 то все прекрасно работает и записывается в память и из нее читается и по USB оправляется и в калибровках джойстика отображается. Блин где бы достать mma7455 для протеуса.
Например по http://avrdevices.ru/akselerometr_mma7455l/ вроде в протеусе показан акселерометр.
|
|
|
|
DAlexV |
Дата: Пт, 17.08.2012, 19:28 | Сообщение # 13 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (somlich) адрес не $1d как у меня а стандартный адрес $A0 Прошу прощения, похоже это я туплю сегодня. Про адресацию совсем забыл. Quote (somlich) Блин где бы достать mma7455 для протеуса Полную модель, это вряд ли. Варианта 2. Или искать что то что подойдет по адресации и регистрам, или писать свое (заморочно, но можно). Есть в Протеусе еще один элементик I2CSLAVE называется, но с ним не приходилось работать.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
somlich |
Дата: Пт, 17.08.2012, 19:33 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Начал соображать
Сообщений:
35
Замечания:
±
На сайте с 23.02.2009
Статус:
Offline
|
В общем закажу наверно в Китае аналоговые акселерометры, буду спокойно АЦП делать и все Например ADXL335
Сообщение отредактировал
somlich - Пт, 17.08.2012, 20:26
|
|
|
|
DAlexV |
Дата: Пт, 17.08.2012, 22:51 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Quote (somlich) В общем закажу наверно в Китае аналоговые акселерометры, буду спокойно АЦП делать и все Спокойствие, только спокойствие Так как малехо напутал, придется расхлебывать. Попробую написать имитатор MMA7455L пару-тройку активных регистров для отладки, тем паче что нашел библиотеку для работы I2C Slave. Сейчас изучаю, и ломаю. Так что могет и получится.
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|