Столкнулся с проблемой. Камен - 18F4550, проблема с модулем MSSP.
Решил воспользоваться библиотеками микрочипа. Акселерометр ST lis3lv02dl. Опыт с ним уже имел, на х51 собирал проект с ним, работает, захотелось нечто подобное собрать и на пике, но вот незадача, на линиях SDA & SCL тишина полная, т.е. подцепляюсь осцилографом я вижу полный штиль на линиях. Может быть я куда-то не правильно ткнулся (я про код) ?
Код
#include <p18f4550.h> //Включаем в наш проект хеад файлы
#include <i2c.h>
//Конфигурация процессора
#pragma config FOSC = INTOSCIO_EC //выбор типа кристала (4MHZ)
#pragma config PLLDIV = 1
#pragma config WDT = OFF //Выключаем сторожевой таймер
#pragma config LVP = OFF //выключаем низковольтовое напряжение
#pragma config MCLRE = OFF // Выключаем пин сброса
#pragma config XINST = OFF //Выключаем расширенный набор функции
#pragma config FCMEN = OFF
#pragma config PWRT = OFF
#pragma config VREGEN = OFF
#pragma config CCP2MX = OFF
#pragma config BOR = OFF
#define AXS_ADR 0x3A
#define WHO_I_AM 0x0F
#define OUTX_L 0x28
#define OUTX_H 0x29
#define OUTY_L 0x2A
#define OUTY_H 0x2B
#define OUTZ_L 0x2C
#define OUTZ_H 0x2D
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define STATUS_REG 0x27
#define REG1 0xD7
#define REG2 0x40
unsigned char STAT=0;
unsigned short AXS_X=0;
unsigned char dat=0;
void send_data(unsigned char ADR,unsigned char DATA)
{
unsigned char temp;
temp=AXS_ADR<<1; // 3A=0b00111010 -> 0b01110100
// т.к. происходит запись, то r/w=0, => не трогаем
StartI2C(); // Start I2C
IdleI2C(); // Ждём пока отпустит
WriteI2C(temp); // Записали адресс+операцию выполняемую
IdleI2C(); // Ждём пока отпустит
WriteI2C(ADR); // Отправляем адресс регистра
IdleI2C(); // Ждём пока отпустит
WriteI2C(DATA); // Отправляем новое значение регистра
IdleI2C(); // Ждём пока отпустит
}
unsigned char read_data(unsigned char ADR)
{
unsigned char temp;
temp=AXS_ADR<<1; // 3A=0b00111010 -> 0b01110100
temp++; // бит r/w=1 => инкрементируем в значение 0b01110101
StartI2C(); // Start I2C
IdleI2C(); // Ждём пока отпустит
WriteI2C(temp); // Записали адресс+операцию выполняемую (чтение)
IdleI2C(); // Ждём пока отпустит
WriteI2C(ADR); // Пишем адресс считываемого регистра
IdleI2C(); // Ждём пока отпустит
dat=ReadI2C(); // Читаем значение с регистра
}
void main(void)
{
OpenI2C(MASTER, SLEW_ON); //MASTER
SSPADD=0x27; //baud rate - 100kHz, 4MHz (Таблица в ДШ BRG)
//Конфигурируем Акселерометр:
send_data(CTRL_REG1,REG1);
send_data(CTRL_REG2,REG2);
while(1)
{
read_data(OUTX_H); // Считываем старший разряд ускорения по Х
AXS_X=dat;
AXS_X=AXS_X<<8; // смещаем до 16-битного числа
read_data(OUTX_L);
AXS_X=AXS_X+dat; // получаем 16-битное число OUTX_H_OUTX_L
}
}
#include <i2c.h>
//Конфигурация процессора
#pragma config FOSC = INTOSCIO_EC //выбор типа кристала (4MHZ)
#pragma config PLLDIV = 1
#pragma config WDT = OFF //Выключаем сторожевой таймер
#pragma config LVP = OFF //выключаем низковольтовое напряжение
#pragma config MCLRE = OFF // Выключаем пин сброса
#pragma config XINST = OFF //Выключаем расширенный набор функции
#pragma config FCMEN = OFF
#pragma config PWRT = OFF
#pragma config VREGEN = OFF
#pragma config CCP2MX = OFF
#pragma config BOR = OFF
#define AXS_ADR 0x3A
#define WHO_I_AM 0x0F
#define OUTX_L 0x28
#define OUTX_H 0x29
#define OUTY_L 0x2A
#define OUTY_H 0x2B
#define OUTZ_L 0x2C
#define OUTZ_H 0x2D
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define STATUS_REG 0x27
#define REG1 0xD7
#define REG2 0x40
unsigned char STAT=0;
unsigned short AXS_X=0;
unsigned char dat=0;
void send_data(unsigned char ADR,unsigned char DATA)
{
unsigned char temp;
temp=AXS_ADR<<1; // 3A=0b00111010 -> 0b01110100
// т.к. происходит запись, то r/w=0, => не трогаем
StartI2C(); // Start I2C
IdleI2C(); // Ждём пока отпустит
WriteI2C(temp); // Записали адресс+операцию выполняемую
IdleI2C(); // Ждём пока отпустит
WriteI2C(ADR); // Отправляем адресс регистра
IdleI2C(); // Ждём пока отпустит
WriteI2C(DATA); // Отправляем новое значение регистра
IdleI2C(); // Ждём пока отпустит
}
unsigned char read_data(unsigned char ADR)
{
unsigned char temp;
temp=AXS_ADR<<1; // 3A=0b00111010 -> 0b01110100
temp++; // бит r/w=1 => инкрементируем в значение 0b01110101
StartI2C(); // Start I2C
IdleI2C(); // Ждём пока отпустит
WriteI2C(temp); // Записали адресс+операцию выполняемую (чтение)
IdleI2C(); // Ждём пока отпустит
WriteI2C(ADR); // Пишем адресс считываемого регистра
IdleI2C(); // Ждём пока отпустит
dat=ReadI2C(); // Читаем значение с регистра
}
void main(void)
{
OpenI2C(MASTER, SLEW_ON); //MASTER
SSPADD=0x27; //baud rate - 100kHz, 4MHz (Таблица в ДШ BRG)
//Конфигурируем Акселерометр:
send_data(CTRL_REG1,REG1);
send_data(CTRL_REG2,REG2);
while(1)
{
read_data(OUTX_H); // Считываем старший разряд ускорения по Х
AXS_X=dat;
AXS_X=AXS_X<<8; // смещаем до 16-битного числа
read_data(OUTX_L);
AXS_X=AXS_X+dat; // получаем 16-битное число OUTX_H_OUTX_L
}
}
Контроллер виснет на чтении данных, т.е. передача "осуществляется", а вот с чтением данных уже посложнее, точнее она отсутствует (хотя по моему мнению отсутвует и передача данных, осцилографом изменений не вижу никаких).
или же проблема заключается в том, что всю эту радость я пытаюсь завести от внутреннего генератора ?
p.s. забыл, т.к. 10кОм найдены не были, засунул от линии на VDD 16kOm резисторы.