Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > OpenWRT/LEDE

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.05.2016, 14:44   #1
CAHTEXHIK
Junior Member
 
Регистрация: 27.04.2016
Сообщений: 7
Вес репутации: 0
CAHTEXHIK is an unknown quantity at this point
По умолчанию Re: Расширитель gpio (ввода/вывода) TP-LINK TL-MR3020 по i2c на PCF8574

То же, только вместо PCF8574 atmega8 (и тд)

Код:
#include <avr/io.h>
#include <compat/twi.h>
#include <avr/interrupt.h>
 
#define I2CSLAVE_ADDR       0x4E
 
#define PORT_DDR            0xB0 // PORTB Settings
#define PORT_IN             0xB1 // Get PINB
#define PORT_OUT            0xB2 // Set PORTB
 
unsigned char regaddr; // Store the Requested Register Address
unsigned char regdata; // Store the Register Address Data
 
void i2c_slave_action(unsigned char rw_status)
{
    switch(regaddr) {
		//   PORTB ^= 0x03;
        // PORT
        case PORT_DDR:
            if (rw_status == 0)
                // read
                regdata = DDRB;
            else
                // write
                DDRB = regdata;
             
            break;
 
        case PORT_IN:
            if (rw_status == 0)
                // read
                regdata = PINB;
            break;
 
        case PORT_OUT:
            if (rw_status == 1)
                // write
                PORTB = regdata;
               
            break;
    }
}
 
ISR(TWI_vect)
{
    static unsigned char i2c_state;
    unsigned char twi_status;
 
    // Disable Global Interrupt
    cli();
 
    // Get TWI Status Register, mask the prescaler bits (TWPS1,TWPS0)
    twi_status=TWSR & 0xF8;     
 
    switch(twi_status) {
        case TW_SR_SLA_ACK: // 0x60: SLA+W received, ACK returned
            i2c_state=0;    // Start I2C State for Register Address required
            break;
 
        case TW_SR_DATA_ACK:    // 0x80: data received, ACK returned
            if (i2c_state == 0) {
                regaddr = TWDR; // Save data to the register address
                i2c_state = 1;
            } else {
                regdata = TWDR; // Save to the register data
                i2c_state = 2;
            }
            break;
 
        case TW_SR_STOP:    // 0xA0: stop or repeated start condition received while selected
            if (i2c_state == 2) {
                i2c_slave_action(1);    // Call Write I2C Action (rw_status = 1)
                i2c_state = 0;      // Reset I2C State
            }
            break;
 
        case TW_ST_SLA_ACK: // 0xA8: SLA+R received, ACK returned
        case TW_ST_DATA_ACK:    // 0xB8: data transmitted, ACK received
            if (i2c_state == 1) {
                i2c_slave_action(0);    // Call Read I2C Action (rw_status = 0)
                TWDR = regdata;     // Store data in TWDR register
                i2c_state = 0;      // Reset I2C State
            }
            break;
 
        case TW_ST_DATA_NACK:   // 0xC0: data transmitted, NACK received
        case TW_ST_LAST_DATA:   // 0xC8: last data byte transmitted, ACK received
        case TW_BUS_ERROR:  // 0x00: illegal start or stop condition
        default:
            i2c_state = 0;  // Back to the Begining State
    }
    // Clear TWINT Flag
    TWCR |= (1<<TWINT);
    // Enable Global Interrupt
    sei();
}
 
int main(void)
{
    // TWI Pull UP
    PORTC |= ((1<<PINC4) | (1<<PINC5));
 
    // Initial I2C Slave
    TWAR = I2CSLAVE_ADDR & 0xFE;    // Set I2C Address, Ignore I2C General Address 0x00
    TWDR = 0x00;            // Default Initial Value
 
    // Start Slave Listening: Clear TWINT Flag, Enable ACK, Enable TWI, TWI Interrupt Enable
    TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN) | (1<<TWIE);
 
    // Enable Global Interrupt
    sei();
 
    // Initial Variable Used
    regaddr=0;
    regdata=0;
 
    while (1) {
 
    }
 
}
Ноги дергал так:
Код:
# i2cset -y 0 0x27 0xB0 0xff
# i2cset -y 0 0x27 0xB2 0xff
# i2cset -y 0 0x27 0xB2 0x00
# i2cset -y 0 0x27 0xB2 0x01
# i2cget -y 0 0x27 0xB1

0x01
# i2cset -y 0 0x27 0xB2 0x03
# i2cget -y 0 0x27 0xB1

0x03
, где 0x27 - код устройства, далее адрес и состояние.

Извиняюсь если оффтопнул, но в соседней теме у меня так ничего и не вышло со связкой роутер-UART-atmega. Зато вот получилось сделать роутер-i2c-atmega.
Код скоперфильдил отсюда
CAHTEXHIK вне форума   Ответить с цитированием
Старый 01.06.2015, 23:44   #2
sakatgg
Senior Member
 
Регистрация: 15.07.2014
Сообщений: 939
Вес репутации: 989
sakatgg is just really nicesakatgg is just really nicesakatgg is just really nicesakatgg is just really nicesakatgg is just really nice
По умолчанию Re: Расширитель gpio (ввода/вывода) TP-LINK TL-MR3020 по i2c на PCF8574

Ошибся немного, i2c-0 появиться после insmod i2c-gpio-custom bus0=0,*,*
А вот как должно по команде
root@OpenWrt:~# insmod i2c-dev
module is already loaded - i2c-dev
P.S. Роутер какой?

Последний раз редактировалось sakatgg; 01.06.2015 в 23:58.
sakatgg вне форума   Ответить с цитированием
Старый 02.06.2015, 01:08   #3
avgaz
Senior Member
 
Регистрация: 05.10.2014
Сообщений: 190
Вес репутации: 0
avgaz is an unknown quantity at this point
По умолчанию Re: Расширитель gpio (ввода/вывода) TP-LINK TL-MR3020 по i2c на PCF8574

MR3020 прошивка CyberWrt
Делаю как в первом сообщении
Код:
root@CyberWrt:/www/> opkg update && opkg install i2c-tools
Downloading http://cyberwrt.ru/application/packages/TL-MR3020/1_4/Packages.gz.
Updated list of available packages in /var/opkg-lists/cyberwrt_pack.
Installing i2c-tools (2013-12-15-1) to root...
Downloading http://cyberwrt.ru/application/packages/TL-MR3020/1_4/i2c-tools_2013-12-15-1_ar71xx.ipk.
Installing libi2c (2013-12-15-1) to root...
Downloading http://cyberwrt.ru/application/packages/TL-MR3020/1_4/libi2c_2013-12-15-1_ar71xx.ipk.
Configuring libi2c.
Configuring i2c-tools.
Далее
Код:
root@CyberWrt:/www/> opkg install kmod-i2c-gpio-custom
Installing kmod-i2c-gpio-custom (3.10.4-2) to root...
Downloading http://cyberwrt.ru/application/packages/TL-MR3020/1_4/kmod-i2c-gpio-custom_3.10.4-2_ar71xx.ipk.
Installing kmod-i2c-core (3.10.4-1) to root...
Downloading http://cyberwrt.ru/application/packages/TL-MR3020/1_4/kmod-i2c-core_3.10.4-1_ar71xx.ipk.
Installing kmod-i2c-gpio (3.10.4-1) to root...
Downloading http://cyberwrt.ru/application/packages/TL-MR3020/1_4/kmod-i2c-gpio_3.10.4-1_ar71xx.ipk.
Installing kmod-i2c-algo-bit (3.10.4-1) to root...
Downloading http://cyberwrt.ru/application/packages/TL-MR3020/1_4/kmod-i2c-algo-bit_3.10.4-1_ar71xx.ipk.
Configuring kmod-i2c-core.
Configuring kmod-i2c-algo-bit.
Configuring kmod-i2c-gpio.
Configuring kmod-i2c-gpio-custom.
Ну и далее
Код:
root@CyberWrt:/www/> insmod i2c-dev
insmod: can't insert 'i2c-dev': File exists
avgaz вне форума   Ответить с цитированием
Старый 19.08.2015, 15:32   #4
Voffka
Junior Member
 
Регистрация: 13.08.2015
Сообщений: 5
Вес репутации: 0
Voffka is an unknown quantity at this point
По умолчанию Re: Расширитель gpio (ввода/вывода) TP-LINK TL-MR3020 по i2c на PCF8574

Прошивка CyberWrt
Китайский модуль I2C на чипе PCF8574T

Ставим CyberWrt. Заходим через Putty под root'ом
Доустанавливаем пакеты:

opkg install kmod-i2c-core
opkg install kmod-i2c-gpio-custom
opkg install i2c-tools


добавляем эти строчки в /etc/rc.local

rmmod gpio_button_hotplug
insmod i2c-gpio-custom bus0=0,18,20
echo pcf8574 0x27 > /sys/bus/i2c/devices/i2c-0/new_device
echo 56 > /sys/class/gpio/export
echo 57 > /sys/class/gpio/export
echo 58 > /sys/class/gpio/export
echo 59 > /sys/class/gpio/export
echo 60 > /sys/class/gpio/export
echo 61 > /sys/class/gpio/export
echo 62 > /sys/class/gpio/export
echo 63 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio56/direction
echo out > /sys/class/gpio/gpio57/direction
echo out > /sys/class/gpio/gpio58/direction
echo out > /sys/class/gpio/gpio59/direction
echo out > /sys/class/gpio/gpio60/direction
echo out > /sys/class/gpio/gpio61/direction
echo out > /sys/class/gpio/gpio62/direction
echo out > /sys/class/gpio/gpio63/direction

перезагружаемся

Последний раз редактировалось Voffka; 19.08.2015 в 16:51.
Voffka вне форума   Ответить с цитированием
Старый 11.09.2015, 20:35   #5
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1030
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию Re: Расширитель gpio (ввода/вывода) TP-LINK TL-MR3020 по i2c на PCF8574

Сегодня пришла ко мне сия платка (заказывал в апреле!) в связи с чем нубские вопросы (не бейте ногами):
1. Зачем джампер сбоку?
2. Синяя крутилка под крестовую отвертку (в интернетах нашел, что она регулирует контрастность при подключении дисплея) на что-нибудь влияет?
3. К земле ноги можно притягивать или только к +5V?
4. Я насчитал 16 ног в гребенке, а в /sys/class/gpio/export отправляют только 8, почему?
Tohin вне форума   Ответить с цитированием
Старый 11.09.2015, 22:03   #6
sakatgg
Senior Member
 
Регистрация: 15.07.2014
Сообщений: 939
Вес репутации: 989
sakatgg is just really nicesakatgg is just really nicesakatgg is just really nicesakatgg is just really nicesakatgg is just really nice
По умолчанию Re: Расширитель gpio (ввода/вывода) TP-LINK TL-MR3020 по i2c на PCF8574

1. Отключает подсветку, если к дисплею цепляешь
2. Контрастность дисплея
3. Запитывать от 3.3В лучше, так как sda, slc подвязаны через 4.7kOm к питанию. Если к 5В, то лучше делитель сделать и подвязать к земле 10kOm. Возможно gpio уже подвязатны в роутере к земле
4. Картинка в помощь, возможны небольшие отличия
Миниатюры
Нажмите на изображение для увеличения
Название: hd44780_.png
Просмотров: 399
Размер:	229.4 Кб
ID:	3038  

Последний раз редактировалось sakatgg; 11.09.2015 в 22:15.
sakatgg вне форума   Ответить с цитированием
Старый 17.09.2015, 16:13   #7
Flom
Junior Member
 
Регистрация: 02.09.2015
Сообщений: 11
Вес репутации: 0
Flom is an unknown quantity at this point
По умолчанию Re: Расширитель gpio (ввода/вывода) TP-LINK TL-MR3020 по i2c на PCF8574

Цитата:
Сообщение от melsem Посмотреть сообщение
Расширитель gpio (ввода/вывода) портов на чипе PCF8574

Пример с LCD:
Фаил hd44780.ko с архива закинуть в /lib/modules/3.10.4
Исправил в модуле hd44780 (использовавший 6-пинов проца) под присланные с китая i2c платы на PCF8574.
wn1602 и 2004 по шине i2c работают.
Как исправить в модуле SDA и SLC на свои gpio (SDA - 3, SLC - 4)?
Flom вне форума   Ответить с цитированием
Старый 18.09.2015, 10:22   #8
sakatgg
Senior Member
 
Регистрация: 15.07.2014
Сообщений: 939
Вес репутации: 989
sakatgg is just really nicesakatgg is just really nicesakatgg is just really nicesakatgg is just really nicesakatgg is just really nice
По умолчанию Re: Расширитель gpio (ввода/вывода) TP-LINK TL-MR3020 по i2c на PCF8574

insmod i2c-gpio-custom bus0=0,3,4
sakatgg вне форума   Ответить с цитированием
Старый 18.09.2015, 16:19   #9
Flom
Junior Member
 
Регистрация: 02.09.2015
Сообщений: 11
Вес репутации: 0
Flom is an unknown quantity at this point
По умолчанию Re: Расширитель gpio (ввода/вывода) TP-LINK TL-MR3020 по i2c на PCF8574

Имею в наличии dir-320A1, прошитый Openwrt
подключен дисплей с YwRobot Adruino LCM1602 IIC V1
дальше insmod i2c-gpio-custom bus0=0,3,4

установлены модули:
i2c_gpio
i2c_gpio_custom
i2c_algo_bit
i2c_dev
i2c_core

root@OpenWrt:~# cat /sys/kernel/debug/gpio
GPIOs 0-15, bcm47xx:
gpio-3 (sda ) in hi
gpio-4 (scl ) in hi


root@OpenWrt:~# i2cdetect -y i2c-gpio0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

а дальше тупик, файл из первого поста не ставиться.
Собрал пакет из исходников по умолчанию, все установилось
в папке /dev помимо прочего появились i2c-0 и hd44780,
но при попытке послать какую нибудь команду
типа echo -n 'hello world' > /dev/hd44780
терминал зависает, что делать?

Последний раз редактировалось Flom; 18.09.2015 в 16:37.
Flom вне форума   Ответить с цитированием
Старый 18.09.2015, 16:47   #10
sakatgg
Senior Member
 
Регистрация: 15.07.2014
Сообщений: 939
Вес репутации: 989
sakatgg is just really nicesakatgg is just really nicesakatgg is just really nicesakatgg is just really nicesakatgg is just really nice
По умолчанию Re: Расширитель gpio (ввода/вывода) TP-LINK TL-MR3020 по i2c на PCF8574

Цитата:
файл из первого поста не ставиться.
Тот вроде для ar71xx
Цитата:
root@OpenWrt:~# cat /sys/kernel/debug/gpio
GPIOs 0-15, bcm47xx:
gpio-3 (sda ) in hi
gpio-4 (scl ) in hi
Тут не видно что gpio на PCF8574 добавились, или не все команды ввели
sakatgg вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 03:54. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика