|
|
  |
SPI отправка и получение данных с регистров ведомого устр. |
|
|
|
Apr 17 2011, 19:49
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-03-11
Пользователь №: 63 737

|
Да, для I2C, но чем она для SPI не подходит то. Просто добавил 1 каскад для CS.
|
|
|
|
|
Apr 18 2011, 04:20
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-03-11
Пользователь №: 63 737

|
4-х проводной SPI используется, SCK, MOSI, MISO и SS. SS настроен на выход как в ДШ, чтоб МК не "пугался" когда я его опускаю.
|
|
|
|
|
Apr 18 2011, 09:39
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-03-11
Пользователь №: 63 737

|
да, преобразую только СS MISO, MOSI. SCK оставил без согласования
|
|
|
|
|
Apr 18 2011, 10:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата(eugmai86 @ Apr 10 2011, 19:38)  Доброго времени суток, есть проблема чтения и записи регистров модуля акселерометра работающего через SPI. Подскажите как на Си читать и писать в регистры данного модуля. Например нужно отправить с меги 16 значение 0b00000101 в регистр $16. SPI разобрался как конфигурировать, проблема за малым. Спасибо[attachment=55349:MMA7455L...________.pdf] Успешно применяем данный акселерометр в проектах. Код инициализации и управления довольно простой - не жалко привести полностью Основные условия - MOSI, MISO, SCK, nCS должны быть согласовыны по уровням с управляющим процессором. SELECT_SPI(pin) - думаю сами догадаетесь как организовать SPIWriteChar(unsigned char), SPIReadChar() - в любой доке на атмегу есть 100% рабочий код отправки/приёма данных по SPI Естественно перед работой SPI настраивается в режиме мастер а nCS как выход. CODE #ifndef mm745x_h #define mm745x_h
/****************************************************************/ //адреса регистро акселерометра enum { XOUTL = 0x00, //10битные регистры результата по осям XYZ XOUTH = 0x01, YOUTL = 0x02, YOUTH = 0x03, ZOUTL = 0x04, ZOUTH = 0x05, XOUT8 = 0x06, //8битные регистры результата по осям XYZ YOUT8 = 0x07, ZOUT8 = 0x08, STATUS = 0x09, //регистр статуса DETSRC = 0x0a, // TOUT = 0x0B, I2CCAD = 0x0D, //регистр адреса I2C, старший бит запрещает I2C XOFFL = 0x10, //10битные регистры сдвига по осям XYZ XOFFH = 0x11, YOFFL = 0x12, YOFFH = 0x13, ZOFFL = 0x14, ZOFFH = 0x15, MCTL = 0x16, //регистр рабочего режима INTRST = 0x17, //регистр сброса прерываний CTL1 = 0x18, // CTL2 = 0x19, // LDTH = 0x1A, //минимальный порог уровня PDTH = 0x1B, //минимальный порог импульса PW = 0x1C, //величина длительности LT = 0x1D, //величина задержки TW = 0x1E, //длительность окна для второго импульса }; /****************************************************************/
/****************************************************************/ //константы регистра статуса (регистр STATUS) enum{ DRDYStat = (1<<0), //статус данных DOVRStat = (1<<1), //статус перезаписи данных PERRStat = (1<<2), //ошибка чётности при тесте }; /****************************************************************/
/****************************************************************/ //константы настройки интерфейса I2C (разрешение/запрещение, регистр I2CCAD) enum{ I2CDIS = (1<<7), //запрещение интерфейса I2C установкой бита I2CDIS в 1 }; /****************************************************************/
/****************************************************************/ //константы настройки рабочего режима (регистр MCTL) enum{ STDB = 0, //режимы работы MES = 1, LEVEL = 2, PULSE = 3, G8 = (0<<2), //настройка чувствительности G4 = (1<<2), G2 = (2<<2), SPI4 = (0<<5), //режим работы spi SPI3 = (1<<5), DRDYPINON = (0<<6), //режим работы вывода DRDY DRDYPINOFF = (1<<6), }; /****************************************************************/
/****************************************************************/ //константы настройки рабочего режима (регистр INTRST) enum{ CLRINT2 = (1<<1), //сброс INT2 - сначала записываем 1 потом 0 CLRINT1 = (1<<0), //сброс INT1 - сначала записываем 1 потом 0 }; /****************************************************************/
#endif //mm745x_h
/*********************************************************/ //запись значения в заданный адрес void mm745xWrite(unsigned char reg, unsigned char data) { SELECT_SPI(nSS_MM745X); SPIWriteChar( ((reg &0x3F)<<1)|0x80 ); SPIWriteChar(data); DESELECT_SPI(); } /*********************************************************/
/*********************************************************/ //чтение значения регистра unsigned char mm745xRead(unsigned char reg) { unsigned char data; SELECT_SPI(nSS_MM745X); SPIWriteChar( (reg &0x3F)<<1 );
data = SPIReadChar(); DESELECT_SPI(); return(data); } /*********************************************************/
/*********************************************************/ mm745xInit(void) { //запрещаем работу шины I2C mm745xWrite(I2CCAD, I2CDIS); //настройка режима работы акселерометра mm745xWrite(MCTL, SPI4|G2|MES); //выполняем фиктивное чтение после инициализации mm745xRead(XOUT8); mm745xRead(YOUT8); mm745xRead(ZOUT8);
} /*********************************************************/
Сообщение отредактировал mempfis_ - Apr 18 2011, 10:06
|
|
|
|
|
Apr 18 2011, 11:10
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 20-03-11
Пользователь №: 63 737

|
спасибо всем! буду пробовать.
|
|
|
|
|
Jun 8 2011, 07:49
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 29-01-09
Пользователь №: 44 159

|
Цитата(rezident @ Apr 17 2011, 22:36)  В функции SPI_MasterReceive у вас присутствует алгоритмическая ошибка, на возможность которой я указал еще в посте №3. Для того, чтобы что-то прочитать мастер должен что-либо передать. Причем запись и чтение идет одновременно, но информация которую должен получать мастер сдвинута по времени как минимум на один байт. Вы первой транзакцией в функции SPI_MasterReceive передаете адрес регистра, но по окончании передачи в регистре приемника SPI вовсе не искомое значение регистра, а некий мусор. Для получения значения нужно, не отпуская CS, произвести еще одну запись, передав dummy-байт. Только после завершения передачи этого второго незначащего байта в регистре приемника SPI будет значение регистра, адрес которого вы передали первым байтом. Все это хорошо видно на времянке Figure11. SPI Timing Diagram for 8-Bit Register Read (4 Wire Mode) из даташит. У меня к Вам вопрос. В случае только одной передачи, о чтении можно "забыть"? Т.е. только посылать данные от master для другого устройства, в моем случае - дисплея?
|
|
|
|
|
Jun 23 2011, 19:25
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 29-01-09
Пользователь №: 44 159

|
Цитата(Палыч @ Jun 8 2011, 13:14)  Можно Никак не получается передача по SPI. Есть ведущий контроллер ADUC831 и ведомый графический OLED дисплей BL12864G (контроллер SSD1303). Оба устройства имеют встроенные SPI…. Задаю конфигурацию SPI: MOV SPICON,#03FH; Т.е SPE=1 разрешение интерфейса SPI ; SPIM=1 режим ведущий; CPOL=1тактирование – SCLOCK - высокий уровень, CPHA=1 срабатывание по переднему фронту SCLOCK; SPR0=1, SPR1=1 Выбранная скорость передачи равна fcore/16. Код ;----------------------------------------- COMMAND: CLR DC ;DC=LOW SEND COMMAND CLR CS NOP NOP ;-------------------------------------- SEND: CLR ISPI NOP MOV SPIDAT,A; OUTPUT JNB ISPI,$ NOP NOP NOP NOP NOP NOP NOP NOP NOP SETB CS NOP NOP RET Код SENDDATA: SETB DC CLR CS NOP NOP SEND1: CLR ISPI NOP MOV SPIDAT,A; OUTPUT JNB ISPI,$ NOP NOP NOP NOP NOP NOP NOP NOP NOP SETB CS; /ss NOP RET Прерывания по SPI: Код SPIG: CLR WCOL CLR ISPI ; CLR LED_RED LCALL DELLM; SETB LED_RED LCALL DELLM;
RETI Да, вот еще... Так ли важно, чтобы сигнал CS (SS), заканчивался с последним тактом SCLOKC, или он может быть длиннее и даже значительно длиннее?
Сообщение отредактировал Белка12 - Jun 23 2011, 19:26
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|