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

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

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

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

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

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


 
Опции темы

аппаратный i2c на c18

Непрочитано 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,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
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, время: 10:43.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.