Цитата(kosyak© @ Sep 3 2012, 15:47)

Код то у меня есть...только он писан давно и для дургих процессоров.
Он мне не всем нравится..точнее совсем не нравится, имеет неприятные ограничения в использовании.
Приводит такое я не очень хочу ). Поищите в интернете - наверняка найдется более грамотное решение.
А аппаратный I2C все таки хорошо. Правда, если они действительно его поправили ...
ну аппаратный конечно лучше )))
видите ли я новичек в контроллерах...
любую логику реализовать могу запрасто а вот аппаратная часть и периферия мне пока тяжело дается...
уарт вот единственный из интерфейсов освоил... (((
конечно же стараюсь ... набиваю руку...
а ваш пример великолепен... просто - грамотно - четко... "высший пилотаж" )))
и все ошибки по схеме обрабатываются ... у меня был пример более корявый.... здесь можно реализовать контроль статуса связи с контроллером )))
кстати в m0 сейчас поставить вывод в "единицу" через регистр BSRR а сброс в "ноль " через BRR
получилось типа
#define I2CSWM_SETSCL() (I2C_PORT->BSRR |= (1<<I2C_SCL_PIN))
#define I2CSWM_CLEARSCL() (I2C_PORT->BRR |= (1<<I2C_SCL_PIN))
#define I2CSWM_GETSCL() ( (I2C_PORT->IDR & (1<<I2C_SCL_PIN)) == 0 ? 0 : 1 )
#define I2CSWM_SETSDA() (I2C_PORT->BSRR |= (1<<I2C_SDA_PIN))
#define I2CSWM_CLEARSDA() (I2C_PORT->BRR |= (1<<I2C_SDA_PIN))
#define I2CSWM_GETSDA() ( (I2C_PORT->IDR & (1<<I2C_SDA_PIN)) == 0 ? 0 : 1 )
а в stm32f0xx.h есть вообще определения типа
#define GPIO_Pin_0 (uint32_t)(0x00000001)
#define GPIO_Pin_1 (uint32_t)(0x00000002)
#define GPIO_Pin_2 (uint32_t)(0x00000004)
#define GPIO_Pin_3 (uint32_t)(0x00000008)
#define GPIO_Source0 (uint32_t)(0x00)
#define GPIO_Source1 (uint32_t)(0x01)
#define GPIO_Source2 (uint32_t)(0x02)
#define GPIO_Source3 (uint32_t)(0x03)
итд...
получилось проще
#define I2C_SCL_PIN GPIO_Pin_0
#define I2C_SDA_PIN GPIO_Pin_1
#define I2C_SCL_PIN_SOURCE GPIO_Source0
#define I2C_SDA_PIN_SOURCE GPIO_Source1
#define I2C_PORT GPIOB
#define I2CSWM_SETSCL() (I2C_PORT->BSRR |= I2C_SCL_PIN )
#define I2CSWM_CLEARSCL() (I2C_PORT->BRR |= I2C_SCL_PIN )
#define I2CSWM_GETSCL() ( ( I2C_PORT->IDR & I2C_SCL_PIN ) == 0 ? 0 : 1 )
#define I2CSWM_SETSDA() (I2C_PORT->BSRR |= I2C_SDA_PIN)
#define I2CSWM_CLEARSDA() (I2C_PORT->BRR |= I2C_SDA_PIN)
#define I2CSWM_GETSDA() ( ( I2C_PORT->IDR & I2C_SDA_PIN ) == 0 ? 0 : 1 )
и сразу пошел обмен с контроллером ))))))))