123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- #include "i2c.h"
- extern __IO uint8_t I2C_timeout;
- #define wait_event(event, timeout) I2C_timeout = timeout;\
- while(event && I2C_timeout);\
- if(!I2C_timeout) return I2C_TIMEOUT;
- void i2c_master_init(void) {
- uint16_t ccr;
-
- GPIOB->DDR |= (GPIO_PIN_4 | GPIO_PIN_5);
- GPIOB->ODR |= (GPIO_PIN_4 | GPIO_PIN_5);
- GPIOB->CR2 |= (GPIO_PIN_5 | GPIO_PIN_5);
-
- I2C->FREQR = (uint8_t)(F_MASTER_MHZ);
-
- I2C->CR1 &= (uint8_t)(~I2C_CR1_PE);
-
- I2C->CCRH = 0;
-
- ccr = (uint16_t)(F_MASTER_HZ / (2 * F_I2C_HZ));
-
-
-
- I2C->TRISER = (uint8_t)(F_MASTER_MHZ + 1);
- I2C->CCRL = (uint8_t)ccr;
- I2C->CCRH = (uint8_t)((uint8_t)(ccr >> 8) & I2C_CCRH_CCR);
-
- I2C->CR1 |= I2C_CR1_PE;
-
- I2C->CR2 |= I2C_CR2_ACK;
- }
- t_i2c_status i2c_wr_reg(uint8_t address, uint8_t reg_addr, uint16_t data) {
-
- wait_event((I2C->SR3 & I2C_SR3_BUSY), 10);
-
- I2C->CR2 |= I2C_CR2_START;
-
- wait_event(!(I2C->SR1 & I2C_SR1_SB), 1);
-
- I2C->DR = address & 0xFE;
-
- wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 1);
-
- I2C->SR3;
-
- wait_event(!(I2C->SR1 & I2C_SR1_TXE), 1);
-
- I2C->DR = reg_addr;
-
-
- wait_event(!(I2C->SR1 & I2C_SR1_TXE), 1);
-
- I2C->DR = (uint8_t)(data >> 8);
-
- wait_event(!(I2C->SR1 & I2C_SR1_TXE), 1);
-
- I2C->DR = (uint8_t)data;
-
- wait_event(!((I2C->SR1 & I2C_SR1_TXE) && (I2C->SR1 & I2C_SR1_BTF)), 1);
-
- I2C->CR2 |= I2C_CR2_STOP;
-
- wait_event((I2C->CR2 & I2C_CR2_STOP), 1);
- return I2C_SUCCESS;
- }
- t_i2c_status i2c_rd_reg(uint8_t address, uint8_t reg_addr, uint16_t * data) {
-
- wait_event((I2C->SR3 & I2C_SR3_BUSY), 10);
-
- I2C->CR2 |= I2C_CR2_ACK;
-
- I2C->CR2 |= I2C_CR2_START;
-
- wait_event(!(I2C->SR1 & I2C_SR1_SB), 1);
-
- I2C->DR = address & 0xFE;
-
- wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 1);
-
- I2C->SR3;
-
- wait_event(!(I2C->SR1 & I2C_SR1_TXE), 1);
-
- I2C->DR = reg_addr;
-
- wait_event(!((I2C->SR1 & I2C_SR1_TXE) && (I2C->SR1 & I2C_SR1_BTF)), 1);
-
- I2C->CR2 |= I2C_CR2_START;
-
- wait_event(!(I2C->SR1 & I2C_SR1_SB), 1);
-
-
- I2C->DR = address | 0x01;
-
-
- I2C->CR2 |= I2C_CR2_POS;
-
- wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 1);
-
- disableInterrupts();
-
- I2C->SR3;
-
- I2C->CR2 &= (uint8_t)(~I2C_CR2_ACK);
-
- enableInterrupts();
-
-
- wait_event(!(I2C->SR1 & I2C_SR1_BTF), 1);
-
- disableInterrupts();
-
- I2C->CR2 |= I2C_CR2_STOP;
-
- *data = I2C->DR << 8;
-
- enableInterrupts();
- *data |= I2C->DR;
-
- wait_event((I2C->CR2 & I2C_CR2_STOP), 1);
-
- I2C->CR2 &= ~I2C_CR2_POS;
- return I2C_SUCCESS;
- }
|