Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 21.11.2012, 14:33  
danao
Прохожий
 
Регистрация: 28.02.2005
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
danao на пути к лучшему
По умолчанию аппаратный i2c на c18

код:
//частота Fosci = 20 МГц

#include ‹p18f452.h›
#include ‹i2c.h›

#pragma config WDT=OFF,OSC=HS,LVP = OFF

...

SSPADD=0x31;

SSPSTATbits.SMP=0;
SSPSTATbits.CKE=0;

SSPCON1bits.SSPM3=1;
SSPCON1bits.SSPM2=0;
SSPCON1bits.SSPM1=0;
SSPCON1bits.SSPM0=0;

SSPCON1bits.SSPEN=1;

SSPCON2bits.SEN=1;

...

или тоже самое с использованием библиотеки:

OpenI2C(MASTER, SLEW_OFF);
SSPADD = 0x31;
StartI2C();


цитирую мануал:
Чтобы инициировать формирование бита START на шине I2C, необходимо установить бит SEN (SSPCON2‹0›) в "1" ...
... После формирования бита START устанавливается бит S и флаг прерывания SSPIF в "1", BGR загружается новым значением и начинается счет.
По окончании счета бит SEN (SSPCON2‹0›) автоматически сбрасывается в "0"...


проблема в том что после установки бита SEN (SSPCON2‹0›) в "1" ничего не происходит. То есть бит SEN,флаг SSPIF, бит S какими были такими и остаются сколько не жди.
При этом если RC3, RC4 были в "1" то дебугер отлавливает событие START, а если RC3, RC4 были до этого в "0" то не происходит и этого.
Создается такое впечатление что MSSP просто забирает себе выводы, но при этом даже не думает работать с ними.
Подскажите что я упустил из виду?
Реклама:
danao вне форума  
Непрочитано 21.11.2012, 14:56  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: аппаратный i2c на c18

Вот я когда-то писал либу для работы i2c на PIC18F.
Код:
#include "i2c.h"

char i2c_init(unsigned long freq)
{
     unsigned int tmp;
     SSPCON1=(1‹‹SSPEN)|(1‹‹SSPM3);             //I2c Master 8 bit, enable i2c pins
     tmp=Get_Fosc_kHz()/(4*(freq/1000))-1;
     if ((tmp==0)|(tmp›=255)) return i2c_frequency_error;
     SSPADD=tmp;
     if (i2c_stop()!=i2c_stop_ok) return i2c_init_error;
     return i2c_init_ok;
}

char i2c_start(void)
{
     unsigned int tmp=0;
     SSPCON2.SEN=1;
     while ((tmp!=i2c_error_delay)&((SSPCON2.SEN!=0))){tmp++;}
     if (tmp==i2c_error_delay)           return i2c_start_error;
     else                                return i2c_start_ok;
}

char i2c_restart(void)
{
     unsigned int tmp=0;
     SSPCON2.RSEN=1;
     while ((tmp!=i2c_error_delay)&((SSPCON2.RSEN!=0))){tmp++;}
     if (tmp==i2c_error_delay)           return i2c_restart_error;
     else                                return i2c_restart_ok;
}

char i2c_stop(void)
{
     unsigned int tmp=0;
     SSPCON2.PEN=1;
     while ((tmp!=i2c_error_delay)&((SSPCON2.PEN!=0))){tmp++;}
     if (tmp==i2c_error_delay)           return i2c_stop_error;
     else                                return i2c_stop_ok;
}

char i2c_write(char dat)
{
     unsigned int tmp=0;
     if (SSPCON1.WCOL!=0) return i2c_write_collision;                            //collision check
     SSPBUF=dat;                                                                 //write data to buffer
     PIR1.SSPIF=0;                                                               //clear IRQ
     while ((tmp!=i2c_error_delay)&(PIR1.SSPIF==0)){tmp++;}                      //wait for data transfer
     if (tmp==i2c_error_delay)           return i2c_ready_flag_error;            //error
     tmp=0;
     if (SSPCON2.ACKSTAT!=0)             {i2c_stop();return i2c_no_ack_error;}   //check ACKnowledge
     else                                return i2c_data_send_ok;                //ACK received, transfer OK
}
char i2c_read(char *i2c_dat, char ack)
{
     unsigned int tmp=0;
     SSPCON2.RCEN=1;
     while ((tmp!=i2c_error_delay)&(SSPCON2.RCEN!=0)){tmp++;}
     if (tmp==i2c_error_delay)           return i2c_receive_error;
     *i2c_dat=SSPBUF;
     if (ack!=0)  SSPCON2.ACKDT=0;
      else        SSPCON2.ACKDT=1;
     SSPCON2.ACKEN=1;
     tmp=0;
     while ((tmp!=i2c_error_delay)&(SSPCON2.ACKEN!=0)){tmp++;}
     if (tmp==i2c_error_delay)           return i2c_ack_error;
     return i2c_receive_ok;
}
У меня все работало.
Easyrider83 вне форума  
 

Закладки

Метки
c18, i2c
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
аппаратный I2C на PIC18 maxNTF Микроконтроллеры, АЦП, память и т.д 10 04.02.2010 15:32
Аппаратный I2C PIC16F874 - DS3232 Victor_72 Микроконтроллеры, АЦП, память и т.д 0 30.01.2010 19:35
Аппаратный SLAVE I2C в PIC16F877 SGordon Микроконтроллеры, АЦП, память и т.д 0 19.01.2010 15:32
Pic16F887 аппаратный I2C через MicroC Pro GunFighter Микроконтроллеры, АЦП, память и т.д 4 18.12.2009 21:29
Code Vision и аппаратный i2c day177 Микроконтроллеры, АЦП, память и т.д 7 25.01.2008 20:03


Часовой пояс GMT +4, время: 00:44.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot