Ср окт 04, 2017 12:30:16
void I2C_EE_ReadBytes(uint8_t addr, uint8_t* data, uint8_t size)
{
_data = data;
bytes = 0;
I2C1->CR2 &= ~(I2C_CR2_ADD10 | I2C_CR2_RD_WRN);
I2C1->CR2 |= (1 << I2C_CR2_NBYTES_Pos) | addr | I2C_CR2_START;
while((I2C1->ISR & I2C_ISR_TXIS) != I2C_ISR_TXIS);
I2C1->TXDR = 0x00;
while((I2C1->ISR & I2C_ISR_TC) != I2C_ISR_TC);
I2C1->CR2 |= I2C_CR2_AUTOEND | (size << I2C_CR2_NBYTES_Pos) | I2C_CR2_RD_WRN
| I2C_CR2_START | addr;
for(bytes = 0; bytes < size; ++bytes)
{
while((I2C1->ISR & I2C_ISR_RXNE) != I2C_ISR_RXNE);
_data[bytes] = I2C1->RXDR;
}
}
I2C1->CR2 &= ~(I2C_CR2_ADD10 | I2C_CR2_RD_WRN);
I2C1->CR2 |= (1 << I2C_CR2_NBYTES_Pos) | addr | I2C_CR2_START;
while((I2C1->ISR & I2C_ISR_TXIS) != I2C_ISR_TXIS);
I2C1->TXDR = 0x00;
while((I2C1->ISR & I2C_ISR_TC) != I2C_ISR_TC);
Ср окт 04, 2017 12:35:10
Ср окт 04, 2017 13:02:26
Ср окт 04, 2017 13:12:25
#define EEPROM_ADDR 0xA0
#ifdef EE24C32
if (i2c_rd_reg16(EEPROM_ADDR, EEREG_ADDR, pData, sizeof(data)) == I2C_SUCCESS) {
#else
if (i2c_rd_reg(EEPROM_ADDR, EEREG_ADDR, pData, sizeof(data)) == I2C_SUCCESS) {
#endif
t_i2c_status i2c_rd_reg16(unsigned char address, uint16_t reg_addr, char * data, unsigned char length){
unsigned char Count = 0, reg_hi_lo[2], *reg_ptr;
reg_hi_lo[0] = reg_addr>>8;
reg_hi_lo[1] = reg_addr & 0xFF;
reg_ptr = reg_hi_lo;
I2C_BUS->CR2 = I2C_CR2_START | 2<<16 | (address & 0xFE); /* Go */
while ((I2C_BUS->ISR & I2C_ISR_BUSY) == 0); // Ожидать выдачу старта
// Сейчас либо 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_TXIS) I2C_BUS->TXDR = *reg_ptr++; // Отправляю адрес регистра
}
I2C_BUS->CR2 = I2C_CR2_START | ((uint32_t)length<<16) | I2C_CR2_RD_WRN | (address & 0xFE); /* Restart */
while ((I2C_BUS->ISR & I2C_ISR_BUSY)==0); // Ожидать выдачу старта
// Принимаем байты до тех пор, пока не взлетит 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++ = I2C_BUS->RXDR; // Принимаю данные
Count++;
}
}
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;
}
if (Count == length) return I2C_SUCCESS;
else return I2C_ERROR;
}
Ср окт 04, 2017 13:20:30
Ср окт 04, 2017 13:37:40
//******************************************************************************
// Чтение регистра slave-устройства
// Start -> Slave Addr -> Reg. addr -> Restart -> Slave Addr <- data ... -> Stop
//******************************************************************************
t_i2c_status i2c_rd_reg(unsigned char address, unsigned char reg_addr, char * data, unsigned char length){
unsigned char Count = 0;
I2C_BUS->CR2 = I2C_CR2_START | 1<<16 | (address & 0xFE); /* Go */
while ((I2C_BUS->ISR & I2C_ISR_BUSY) == 0); // Ожидать выдачу старта
// Сейчас либо 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_TXIS) I2C_BUS->TXDR = reg_addr; // Отправляю адрес регистра
}
I2C_BUS->CR2 = I2C_CR2_START | ((uint32_t)length<<16) | I2C_CR2_RD_WRN | (address & 0xFE); /* Restart */
while ((I2C_BUS->ISR & I2C_ISR_BUSY)==0); // Ожидать выдачу старта
// Принимаем байты до тех пор, пока не взлетит 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++ = I2C_BUS->RXDR; // Принимаю данные
Count++;
}
}
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;
}
if (Count == length) return I2C_SUCCESS;
return I2C_ERROR;
}
Ср окт 04, 2017 14:11:55
Ср окт 04, 2017 14:26:17
if (I2C_BUS->ISR & I2C_ISR_TXIS) I2C_BUS->TXDR = reg_addr; // Отправляю адрес регистра
Ср окт 04, 2017 14:30:53
Ср окт 04, 2017 14:38:50
Ср окт 04, 2017 14:48:31
Ср окт 04, 2017 14:50:24
Ср окт 04, 2017 15:00:24
Ср окт 04, 2017 15:10:41
Ср окт 04, 2017 16:22:19
Ср окт 04, 2017 16:31:27
Ср окт 04, 2017 17:39:02
Ср окт 04, 2017 17:58:43
Ср окт 04, 2017 18:26:58
Ср окт 04, 2017 18:33:38