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

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

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

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

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

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


 
Опции темы
Непрочитано 06.09.2016, 19:21  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию AT24C32 + STM32F030F4

Добрый день. Пробую подключить епром к МК. Нашел готовую либу. Не компилит из-за двух строк. Немогу понять что нужно?
PHP код:
UserSource\main.c(606): error:  #167: argument of type "unsigned int" is incompatible with parameter of type "uint8_t *" 
вот кусок весь
PHP код:
uint8_t I2C_Temp=25,I2C_Read=0;

#define I2C_BUS I2C1


// Вспомогательные переменные
typedef enum _I2C_Direction {I2C_Transmitter=0I2C_Receiver=1I2C_Direction;
/*
Битовые смещения для настройки разных регистров
Чтобы не использовать в коде магические числа, и код был читаемым
Например:
I2C-›CR2 |= 1‹‹I2C_OFFSET_CR2_NBYTES;    // Здесь понятно, что передаётся 1 байт
I2C-›CR2 |= 1‹‹16;                        // Здесь возникает путаница, то ли 1 байт, то ли 16
*/
#define I2C_OFFSET_TIMINGR_SCLL        0
#define I2C_OFFSET_TIMINGR_SCLH        8
#define I2C_OFFSET_TIMINGR_SDADEL    16
#define I2C_OFFSET_TIMINGR_SCLDEL    20
#define I2C_OFFSET_TIMINGR_PRESC    28
#define I2C_OFFSET_CR2_NBYTES        16


/*
Выполняет первичную настройку шины.
Настраивает порты, альтернативные функции.
Настраивает тайминги для работы шины.
*/
void I2C_Initialization (void)
{
    
// Тактирование GPIO не включаю, т.к. оно уже включено в начале программы
    
RCC-›APB1ENR |= RCC_APB1ENR_I2C1EN;        // Включаю тактирование I2C
    // Настройка ног PB6, PB7
    
GPIOB-›MODER |= GPIO_MODER_MODER6_1 GPIO_MODER_MODER7_1;            // Режим альтернативной функции
    
GPIOB-›OTYPER |= GPIO_OTYPER_OT_6 GPIO_OTYPER_OT_7;                // Открытый коллектор
    
GPIOB-›OSPEEDR |= GPIO_OSPEEDR_OSPEEDR6 GPIO_OSPEEDR_OSPEEDR7;    // Максимальная скорость
    // Выбор альтернативной функции
    
GPIO_PinAFConfig(GPIOBGPIO_PinSource6GPIO_AF_1);    // I2C1_SCL
    
GPIO_PinAFConfig(GPIOBGPIO_PinSource7GPIO_AF_1);    // I2C1_SDA
    
    
I2C_BUS-›CR1 &= ~I2C_CR1_PE;            // Отключаю I2C
    
while (I2C_BUS-›CR1 I2C_CR1_PE) {};    // Жду пока отключится
    
    // Частота тактирования модуля I2C = 48 МГц
    // Частота шины I2C = 100 kHz
    // Настраиваю тайминги
    
I2C_BUS-›TIMINGR |= \
    (
0xB  ‹‹ I2C_OFFSET_TIMINGR_PRESC)|\
    (
0x13 ‹‹ I2C_OFFSET_TIMINGR_SCLL)|\
    (
0xF  ‹‹ I2C_OFFSET_TIMINGR_SCLH)|\
    (
0x4  ‹‹ I2C_OFFSET_TIMINGR_SCLDEL)|\
    (
0x2  ‹‹ I2C_OFFSET_TIMINGR_SDADEL);
    
    
I2C_BUS-›CR1 |= I2C_CR1_PE;                    // Включаю I2C
    
while ((I2C_BUS-›CR1 I2C_CR1_PE)==0) {};    // Жду пока включится
}


/*
Это служебная функция, использовать её не нужно.
Устанавливает направление данных - приём или передача.
Задаёт объём пересылаемых данных.
Задаёт адрес ведомого устройства.
Выдаёт старт на шину.
Параметры:
Direction - направление (0-отправка, 1-приём)
Adress - адрес ведомого устройства
Size - размер данных (от 1 до 255 байт)
*/
void I2C_Start_Direction_Adress_Size (I2C_Direction Directionuint8_t Adressuint8_t Size)
{
    
//I2C_BUS-›CR2 &= ~I2C_CR2_AUTOEND;                // Выдавать стоп вручную
    //I2C_BUS-›CR2 &= ~I2C_CR2_RELOAD;                // Не использовать режим перезагрузки
    
if (DirectionI2C_BUS-›CR2 |= I2C_CR2_RD_WRN;    // Режим приёма
    
else I2C_BUS-›CR2 &= ~I2C_CR2_RD_WRN;            // Режим передачи
    
I2C_BUS-›CR2 &= ~I2C_CR2_NBYTES;                // Очистить размер данных
    
I2C_BUS-›CR2 |= Size‹‹I2C_OFFSET_CR2_NBYTES;    // Установить размер данных
    
I2C_BUS-›CR2 &= ~I2C_CR2_SADD;    // Очистить адрес ведомого устройства
    
I2C_BUS-›CR2 |= Adress;            // Установить адрес ведомого устройства
    
I2C_BUS-›CR2 |= I2C_CR2_START;                    // Выдать старт на шину
    
while ((I2C_BUS-›ISR I2C_ISR_BUSY)==0) {};    // Ожидать выдачу старта
}


/*
Это служебная функция, использовать её не нужно.
Выдаёт стоп на шину.
Очищает флаги.
Проверяет наличие ошибок, очищает флаги ошибок.
*/
void I2C_Stop (void)
{
    
I2C_BUS-›CR2 |= I2C_CR2_STOP;                // Выдать стоп на шину
    
while (I2C_BUS-›ISR I2C_ISR_BUSY) {};        // Ожидать выдачу стопа
    // Очищаю флаги - необходимо для дальнейшей работы шины
    
I2C_BUS-›ICR |= I2C_ICR_STOPCF;        // STOP флаг
    
I2C_BUS-›ICR |= I2C_ICR_NACKCF;        // NACK флаг
    // Если есть ошибки на шине - очищаю флаги
    
if (I2C_BUS-›ISR & (I2C_ISR_ARLO I2C_ISR_BERR))
    {
        
I2C_BUS-›ICR |= I2C_ICR_ARLOCF;
        
I2C_BUS-›ICR |= I2C_ICR_BERRCF;
    }
}


/*
Выполняет транзакцию записи Size байт в регистр Register по адресу Adress.
Параметры:
Adress - адрес ведомого устройства
Register - регистр, в который хотим передать данные
Data - указывает откуда брать данные для передачи
Size - сколько байт хотим передать (от 1 до 254)
Возвращает:
1 - если данные успешно переданы
0 - если произошла ошибка
*/
uint8_t I2C_Write_Transaction (uint8_t Adressuint8_t Registeruint8_t *Datauint8_t Size)
{
    
uint8_t Count=0;    // Счётчик успешно переданных байт
    // Старт
    
I2C_Start_Direction_Adress_Size (I2C_TransmitterAdress1+Size);
    
// Сейчас либо I2C запросит первый байт для отправки,
    // Либо взлетит NACK-флаг, говорящий о том, что микросхема не отвечает.
    // Если взлетит NACK-флаг, отправку прекращаем.
    
while ((((I2C_BUS-›ISR I2C_ISR_TXIS)==0) && ((I2C_BUS-›ISR I2C_ISR_NACKF)==0)) && (I2C_BUS-›ISR I2C_ISR_BUSY)) {};
    if (
I2C_BUS-›ISR I2C_ISR_TXISI2C_BUS-›TXDR=Register;    // Отправляю адрес регистра
    
    // Отправляем байты до тех пор, пока не взлетит TC-флаг.
    // Если взлетит NACK-флаг, отправку прекращаем.
    
while ((((I2C_BUS-›ISR I2C_ISR_TC)==0) && ((I2C_BUS-›ISR I2C_ISR_NACKF)==0)) && (I2C_BUS-›ISR I2C_ISR_BUSY))
    {
        if (
I2C_BUS-›ISR I2C_ISR_TXISI2C_BUS-›TXDR=*(Data+Count++);    // Отправляю данные
    
}
    
I2C_Stop();
    if (
Count == Size) return 1; return 0;
}


/*
Выполняет транзакцию чтения Size байт из регистра Register по адресу Adress.
Параметры:
Adress - адрес ведомого устройства
Register - регистр, из которого хотим принять данные
Data - указывает куда складывать принятые данные
Size - сколько байт хотим принять (от 1 до 255)
Возвращает:
1 - если данные успешно приняты
0 - если произошла ошибка
*/
uint8_t I2C_Read_Transaction (uint8_t Adressuint8_t Registeruint8_t *Datauint8_t Size)
{
    
uint8_t Count=0;    // Счётчик успешно принятых байт
    // Старт
    
I2C_Start_Direction_Adress_Size (I2C_TransmitterAdress1);
    
// Сейчас либо I2C запросит первый байт для отправки,
    // Либо взлетит NACK-флаг, говорящий о том, что микросхема не отвечает.
    // Если взлетит NACK-флаг, отправку прекращаем.
    
while ((((I2C_BUS-›ISR I2C_ISR_TC)==0) && ((I2C_BUS-›ISR I2C_ISR_NACKF)==0)) && (I2C_BUS-›ISR I2C_ISR_BUSY))
    {
        if (
I2C_BUS-›ISR I2C_ISR_TXISI2C_BUS-›TXDR Register;    // Отправляю адрес регистра
    
}
    
// Повторный старт
    
I2C_Start_Direction_Adress_Size (I2C_ReceiverAdressSize);
    
// Принимаем байты до тех пор, пока не взлетит TC-флаг.
    // Если взлетит NACK-флаг, приём прекращаем.
    
while ((((I2C_BUS-›ISR I2C_ISR_TC)==0) && ((I2C_BUS-›ISR I2C_ISR_NACKF)==0)) && (I2C_BUS-›ISR I2C_ISR_BUSY))
    {
        if (
I2C_BUS-›ISR I2C_ISR_RXNE) *(Data+Count++) = I2C_BUS-›RXDR;    // Принимаю данные
    
}
    
I2C_Stop();
    if (
Count == Size) return 1; return 0;
}


int main(void)
{
    
RCC_DeInit();
    
    
PLL52();
    
RCC_AdjustHSICalibrationValue(19);
    
Init_PORT();
    
InitTimer3();
    
    
ADC_continious_ini();
while (
1)
    {
I2C_Write_Transaction0xA02I2C_Temp1);//ОШИБКА
      
I2C_Read I2C_Read_Transaction (0xA02I2C_Read1);//ОШИБКА
        
}

Подскажите что сделать чтобы ошибка ушла?
Реклама:
miwutka вне форума  
Непрочитано 06.09.2016, 19:50  
andries5
Почётный гражданин KAZUS.RU
 
Регистрация: 19.02.2008
Сообщений: 1,772
Сказал спасибо: 123
Сказали Спасибо 599 раз(а) в 416 сообщении(ях)
andries5 на пути к лучшему
По умолчанию Re: AT24C32 + STM32F030F4

Для начала перевести сообщение. Оно говорит, что аргумент с типом "unsigned int" не совместим с типом параметра "uint8_t *". То есть с указателем. В I2C_Read_Transaction и в I2C_Write_Transaction Вы передаете функции саму переменную, а надо указатель на нее. Это сами переменные, а надо создать указатели на них, то есть на их адреса. Так я считаю.
andries5 вне форума  
Непрочитано 06.09.2016, 20:19  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: AT24C32 + STM32F030F4

andries5, напишите плиз строчку с примером... Я с указателями еще не подружился...
miwutka вне форума  
Непрочитано 06.09.2016, 20:52  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: AT24C32 + STM32F030F4

Сообщение от AR_Favorit Посмотреть сообщение
А про указатели лучше узнавать в любом учебнике или разъяснялке по С, их море в сети)
читал, но так и не понял. Надо только на примере. С указателем чуток разобрался. Поставил знак & перед переменной. Ошибка ушла. Но в ините я исправил еще ножки портов. Не те стояли.
Теперь зацикливается тут I2C_Write_Transaction
PHP код:
// Отправляем байты до тех пор, пока не взлетит TC-флаг.
    // Если взлетит NACK-флаг, отправку прекращаем.
    
while ((((I2C_BUS-›ISR I2C_ISR_TC)==0) && ((I2C_BUS-›ISR I2C_ISR_NACKF)==0)) && (I2C_BUS-›ISR I2C_ISR_BUSY))
    {
        if (
I2C_BUS-›ISR I2C_ISR_TXISI2C_BUS-›TXDR=*(Data+Count++);    // Отправляю данные
    

Почему может быть зацикливание...? Как то на атмеге с первого раза заработало ))
miwutka вне форума  
Непрочитано 06.09.2016, 20:54  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: AT24C32 + STM32F030F4

Я в том посте ошибся - не увидел, что есть операции инкремента указателя в теле функций (при которых ни использовать имя массива как указатель нельзя, ни передавать адрес переменной вместо указателя на нее).
Так что можно только так:

Код:
uint8_t I2C_Temp=25; 
uint8_t I2C_Read=0;
uint8_t* pI2C_Temp=&I2C_Temp; //Указатель, которому присвоено значение адреса I2C_Temp
uint8_t* pI2C_Read=&I2C_Read; //Указатель, которому присвоено значение адреса I2C_Read
В функции передаете pI2C_Temp и pI2C_Read вместо I2C_Temp и I2C_Read соответственно.
Если захочется передавать и принимать за один вызов функции больше одного байта - I2C_Temp и I2C_Read должны быть объявлены массивами, и присвоение адреса указателю будет выглядеть даже проще:

Код:
uint8_t I2C_Temp[10]; 
uint8_t I2C_Read[10];
uint8_t* pI2C_Temp=I2C_Temp; //Указатель, которому присвоено значение адреса I2C_Temp
uint8_t* pI2C_Read=I2C_Read; //Указатель, которому присвоено значение адреса I2C_Read

Последний раз редактировалось AR_Favorit; 06.09.2016 в 20:57.
AR_Favorit вне форума  
Непрочитано 06.09.2016, 20:59  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: AT24C32 + STM32F030F4

может у кого есть примеры на SPL по шине I2C дайте плиз чтобы разобраться.....?
miwutka вне форума  
Непрочитано 06.09.2016, 21:03  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: AT24C32 + STM32F030F4

Стопудово на сайте ST в примерах к платам Discovery найдутся)

Хм. Нету((
Миниатюры:
Нажмите на изображение для увеличения
Название: 11209269.png
Просмотров: 0
Размер:	38.1 Кб
ID:	100666  

Последний раз редактировалось AR_Favorit; 06.09.2016 в 21:09.
AR_Favorit вне форума  
Непрочитано 06.09.2016, 22:22  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: AT24C32 + STM32F030F4

Вот же немощные.

http://www.st.com/content/st_com/en/...-stm32048.html
STM32F0 вне форума  
Непрочитано 06.09.2016, 22:35  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: AT24C32 + STM32F030F4

STM32F0, зачем мне StdPeriph??? Я уже столько тем создавал по F030 и что до сих пор не скачал это думаете?? )))) Сейчас скачал апноут для расчета TIMINGR регистра. Без оскорблений оно вижу не уродилося.....
miwutka вне форума  
Непрочитано 06.09.2016, 23:44  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: AT24C32 + STM32F030F4

Тупые халявщики и невконякормщики.
STM32F0 вне форума  
 

Закладки
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
stm32F030f4 + ADC + DMA miwutka ARM 40 05.11.2016 12:42
SOFTPWM stm32f030f4 miwutka Песочница (вопросы новичков) 51 31.08.2016 11:12


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


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