помогите разобраться с I2C .
Процессор(master) должен передать данные в микросхему-аудиокодек(slave). Передача адреса WRITE_ADDRESS=0х20 заканчивается тем, что во время 9ого клока микросхема подтягивает линию SDA к 0, т.е. выдаёт правильный Acknolage, а процессор зачем-то подтягивает её к 1. Бит успешной передачи адреса ADDR не выставляется.
Вопрос : какую именно настройку I2C нужно изменить ?
Код
///////////////////////////передаём данные////////////////////////
void MAX98090_REGISTER_WRITE(unsigned char reg_address,unsigned char data)
{
int i=0;
I2C2->CR1|=I2C_CR1_START;
while(!(I2C2->SR1 & I2C_SR1_SB))
{
i++;
if(i>10000)
return;
}
I2C2->SR1;
I2C2->DR=WRITE_ADDRESS;
while(!(I2C2->SR1 & I2C_SR1_ADDR))
{
i++;
if(i>10000)
return; //вот отсюда программа вылетает !!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
I2C2->SR1;
I2C2->SR2;
I2C2->DR=reg_address;
while (!(I2C2->SR1 & I2C_SR1_BTF))
{
i++;
if(i>10000)
return;
}
I2C2->SR1;
I2C2->SR2;
I2C2->DR=data;
while (!(I2C2->SR1 & I2C_SR1_BTF))
{
i++;
if(i>10000)
return;
}
I2C2->CR1 |= I2C_CR1_STOP;
}
void MAX98090_REGISTER_WRITE(unsigned char reg_address,unsigned char data)
{
int i=0;
I2C2->CR1|=I2C_CR1_START;
while(!(I2C2->SR1 & I2C_SR1_SB))
{
i++;
if(i>10000)
return;
}
I2C2->SR1;
I2C2->DR=WRITE_ADDRESS;
while(!(I2C2->SR1 & I2C_SR1_ADDR))
{
i++;
if(i>10000)
return; //вот отсюда программа вылетает !!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
I2C2->SR1;
I2C2->SR2;
I2C2->DR=reg_address;
while (!(I2C2->SR1 & I2C_SR1_BTF))
{
i++;
if(i>10000)
return;
}
I2C2->SR1;
I2C2->SR2;
I2C2->DR=data;
while (!(I2C2->SR1 & I2C_SR1_BTF))
{
i++;
if(i>10000)
return;
}
I2C2->CR1 |= I2C_CR1_STOP;
}
Код
//////////////////////////////Настраиваем I2C2 для MAX98090 //////////////////////////////
void MAX98090_I2C2_INIT(void)
{
RCC->APB1ENR|=RCC_APB1ENR_I2C2EN; // включаем тактирование I2C2
RCC->APB1LPENR|=RCC_APB1LPENR_I2C2LPEN;
RCC->APB1RSTR|=RCC_APB1RSTR_I2C2RST;
RCC->APB1RSTR&=~RCC_APB1RSTR_I2C2RST; //сбрасываем настройки I2C2
//Системная частота 32МГц
I2C2->CR2&=~I2C_CR2_FREQ;
I2C2->CR2|=I2C_CR2_FREQ_5;
I2C2->CCR|=60;
I2C2->CR1|=I2C_CR1_PE;
}
void MAX98090_I2C2_INIT(void)
{
RCC->APB1ENR|=RCC_APB1ENR_I2C2EN; // включаем тактирование I2C2
RCC->APB1LPENR|=RCC_APB1LPENR_I2C2LPEN;
RCC->APB1RSTR|=RCC_APB1RSTR_I2C2RST;
RCC->APB1RSTR&=~RCC_APB1RSTR_I2C2RST; //сбрасываем настройки I2C2
//Системная частота 32МГц
I2C2->CR2&=~I2C_CR2_FREQ;
I2C2->CR2|=I2C_CR2_FREQ_5;
I2C2->CCR|=60;
I2C2->CR1|=I2C_CR1_PE;
}