input with pull up for(i = 0; i < 8; ++i ){
GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_Low_Slow);//set SCL pin as output high Delay();
GPIO_Init(GPIOC,GPIO_Pin_1,GPIO_Mode_Out_PP_High_Slow);//set SCL pin as output high Delay(); res <<= 1; if(SDA_READ()){ res ++; } } return res; } //写数据
unsigned char BQ25890x_write_reg(unsigned char *pBuffer,unsigned char WriteAddr,unsigned char NumToWrite) {
unsigned char u_wait_err = 0;
IIC_Start();
IIC_Send_Byte(SlaveAddress << 1);//slave addr u_wait_err |= IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr); //register addr u_wait_err |= IIC_Wait_Ack();
while(NumToWrite--) {
IIC_Send_Byte(*pBuffer); u_wait_err |= IIC_Wait_Ack(); pBuffer++; }
IIC_Stop();
if(u_wait_err == 0) return 0; return 1; } //
unsigned char BQ25890x_read_reg(unsigned char *pBuffer,unsigned char WriteAddr,unsigned char NumToRead) {
unsigned char u_wait_err = 0;
IIC_Start();
IIC_Send_Byte(SlaveAddress<<1); // SlaveAddress 0x7e u_wait_err |= IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr); // address u_wait_err |= IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte((SlaveAddress<<1)+1); // SlaveAddress 0x7e u_wait_err |= IIC_Wait_Ack();
while(--NumToRead) {
*pBuffer = IIC_Read_Byte(1); IIC_Ack(); pBuffer++; }
*pBuffer = IIC_Read_Byte(1);
IIC_NAck(); IIC_Stop();
if(u_wait_err == 0) return 0; return 1; }
好了,这就是这部分的内容了。
#include \#include \
#include \
#define AT24C32_SETSDAIN GPIO_Init(AT24C32_SDA_PORT, GPIO_MODE_IN_FL_NO_IT)
#define AT24C32_SETSDAOUT GPIO_Init(AT24C32_SDA_PORT, GPIO_MODE_OUT_OD_LOW_SLOW)
#define I2C_SLAW 0xA0 /*器件地址选择及写标志*/ #define I2C_SLAR 0xA1 /*器件地址选择及读标志*/
GPIO_PIN_6, GPIO_PIN_6,
void nops(void) {
// asm(\// asm(\ uint16_t i = 0; for (; i < 5; i++); }
// 总线复位
void I2C_Reset(void) {
AT24C32_SCL_HIGH; AT24C32_SDA_HIGH; }
// I2C操作严重错误 void I2C_Error(void) {
//复位I2C总线 I2C_Reset();
//进入死循环 while (1) { } }
// 发送起始条件
void I2C_Start_A(void) /*起始条件*/ {
AT24C32_SCL_HIGH; nops();
AT24C32_SDA_LOW; nops();
AT24C32_SCL_LOW; nops(); }
// 停止条件
void I2C_Stop_A(void) {
AT24C32_SDA_LOW; nops();
AT24C32_SCL_HIGH; nops();
AT24C32_SDA_HIGH; nops();
AT24C32_SCL_LOW; nops(); }
// 产生一个时钟信号
uint8_t I2C_GenerateClock(void) {
uint8_t bData = 0; uint16_t t = 0;
AT24C32_SCL_HIGH; nops();
for (t = 0; t < 6; t++);
if (AT24C32_READSDA) {
bData = 1; }
AT24C32_SCL_LOW; nops();
return bData; }
// 应答位
void I2C_Ack(uint8_t bAckYes) {
if (bAckYes) {
AT24C32_SDA_LOW; } else {
AT24C32_SDA_HIGH; }
I2C_GenerateClock();
AT24C32_SDA_HIGH; }
// 发送数据子程序, ucData为要求发送的数据 uint8_t I2C_Send(uint8_t ucData) {
uint8_t i;
for (i = 0; i < 8; i++) {
if (ucData & 0x80) {
AT24C32_SDA_HIGH; } else {
AT24C32_SDA_LOW; }
ucData <<= 1;