Пн апр 01, 2019 14:04:19
#include "stm32f103xb.h"
int main() {
// restart afio
RCC->APB2RSTR |= RCC_APB2RSTR_AFIORST;
// turn on b-pins
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
// turn on afio
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
// turn on I2C1
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
// turn on pins 6, 7
// AF and open-drain and 50MHz
GPIOB->CRL |= 0xFF << 24;
// set i2c1 freq
I2C1->CR2 |= 2;
// set ack
I2C1->CR1 |= I2C_CR1_ACK;
// set Pause
I2C1->CCR |= 100;
// trise
I2C1->TRISE |= 9;
// on i2c
I2C1->CR1 |= I2C_CR1_PE;
// start signal
I2C1->CR1 |= I2C_CR1_START;
while (!(I2C1->SR1 & I2C_SR1_SB));
(void) I2C1->SR1;
I2C1->DR |= 0x27 << 1;
while (!(I2C1->SR1 & (I2C_SR1_ADDR)));
(void) I2C1->SR1;
(void) I2C1->SR2;
I2C1->DR |= ('a' & 0xF0) | 0x08 | 0x04 | 0x01;
while (!(I2C1->SR1 & (I2C_SR1_BTF)));
(void) I2C1->SR1;
(void) I2C1->SR2;
I2C1->DR |= ('a' & 0xF0) | 0x08 | 0x00 | 0x01;
while (!(I2C1->SR1 & (I2C_SR1_BTF)));
(void) I2C1->SR1;
(void) I2C1->SR2;
I2C1->DR |= (('a' & 0x0F) << 4) | 0x08 | 0x04 | 0x01;
while (!(I2C1->SR1 & (I2C_SR1_BTF)));
(void) I2C1->SR1;
(void) I2C1->SR2;
I2C1->DR |= (('a' & 0x0F) << 4) | 0x08 | 0x00 | 0x01;
while (!(I2C1->SR1 & (I2C_SR1_BTF)));
(void) I2C1->SR1;
(void) I2C1->SR2;
I2C1->CR1 |= I2C_CR1_STOP;
while (1);
return 0;
}
Вт апр 02, 2019 20:49:58
Ср апр 03, 2019 20:10:16
Пт апр 05, 2019 09:10:39
Пт апр 05, 2019 09:18:13
bool EE_24C::WriteByte(uint16_t adr, uint8_t data)
{
pI2C->CR1 = I2C_CR1_PE | I2C_CR1_START;
while(!(pI2C->SR1 & I2C_SR1_SB));
pI2C->DR = w_adr;
while(!(pI2C->SR1 & I2C_SR1_ADDR))
{
if(pI2C->SR1 & I2C_SR1_AF)
{
pI2C->CR1 = I2C_CR1_PE | I2C_CR1_STOP;
return false;
}
};
pI2C->SR2;
while(!(pI2C->SR1 & I2C_SR1_TXE));
pI2C->DR = adr>>8;
while(!(pI2C->SR1 & I2C_SR1_TXE));
pI2C->DR = adr;
while(!(pI2C->SR1 & I2C_SR1_TXE));
pI2C->DR = data;
while(!((pI2C->SR1 & I2C_SR1_TXE) && (pI2C->SR1 & I2C_SR1_BTF)));
pI2C->CR1 = I2C_CR1_PE | I2C_CR1_STOP;
return true;
}
Пт апр 05, 2019 10:44:38
Пт апр 05, 2019 12:40:05