![]() |
|
|||||||
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
|
#1 |
|
Junior Member
Регистрация: 27.04.2016
Сообщений: 7
Вес репутации: 0 ![]() |
То же, только вместо 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 Извиняюсь если оффтопнул, но в соседней теме у меня так ничего и не вышло со связкой роутер-UART-atmega. Зато вот получилось сделать роутер-i2c-atmega. Код скоперфильдил отсюда |
|
|
|
|
|
#2 |
|
Senior Member
Регистрация: 15.07.2014
Сообщений: 939
Вес репутации: 991 ![]() ![]() ![]() ![]() ![]() |
Ошибся немного, 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. |
|
|
|
|
|
#3 |
|
Senior Member
Регистрация: 05.10.2014
Сообщений: 190
Вес репутации: 0 ![]() |
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 |
|
|
|
|
|
#4 |
|
Junior Member
Регистрация: 13.08.2015
Сообщений: 5
Вес репутации: 0 ![]() |
Прошивка 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. |
|
|
|
|
|
#5 |
|
Moderator
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1032 ![]() ![]() ![]() |
Сегодня пришла ко мне сия платка (заказывал в апреле!) в связи с чем нубские вопросы (не бейте ногами):
1. Зачем джампер сбоку? 2. Синяя крутилка под крестовую отвертку (в интернетах нашел, что она регулирует контрастность при подключении дисплея) на что-нибудь влияет? 3. К земле ноги можно притягивать или только к +5V? 4. Я насчитал 16 ног в гребенке, а в /sys/class/gpio/export отправляют только 8, почему? |
|
|
|
|
|
#6 |
|
Senior Member
Регистрация: 15.07.2014
Сообщений: 939
Вес репутации: 991 ![]() ![]() ![]() ![]() ![]() |
1. Отключает подсветку, если к дисплею цепляешь
2. Контрастность дисплея 3. Запитывать от 3.3В лучше, так как sda, slc подвязаны через 4.7kOm к питанию. Если к 5В, то лучше делитель сделать и подвязать к земле 10kOm. Возможно gpio уже подвязатны в роутере к земле 4. Картинка в помощь, возможны небольшие отличия Последний раз редактировалось sakatgg; 11.09.2015 в 22:15. |
|
|
|
|
|
#7 |
|
Junior Member
Регистрация: 02.09.2015
Сообщений: 11
Вес репутации: 0 ![]() |
Как исправить в модуле SDA и SLC на свои gpio (SDA - 3, SLC - 4)?
|
|
|
|
|
|
#8 |
|
Senior Member
Регистрация: 15.07.2014
Сообщений: 939
Вес репутации: 991 ![]() ![]() ![]() ![]() ![]() |
insmod i2c-gpio-custom bus0=0,3,4
|
|
|
|
|
|
#9 |
|
Junior Member
Регистрация: 02.09.2015
Сообщений: 11
Вес репутации: 0 ![]() |
Имею в наличии 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. |
|
|
|
|
|
#10 | ||
|
Senior Member
Регистрация: 15.07.2014
Сообщений: 939
Вес репутации: 991 ![]() ![]() ![]() ![]() ![]() |
Цитата:
Цитата:
|
||
|
|
|
![]() |
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|
|