完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
[local]1[/local]最近在用一个电源管理芯片BQ7693003,然后STM32F107在和它通信时,总是收不到应答,大神求助!我用的是模拟I2C,可以和24C02进行读写,和BQ7693003就不行了。
/* defines ------------------------------------------------------------------*/ #define I2C_PageSize 256 #define I2C1_SLAVE_ADDRESS7_W 0x10 #define I2C1_SLAVE_ADDRESS7_R 0x11 #define FALSE 0 #define TRUE 1 #define SDA_PORT GPIOB #define SCL_PORT GPIOB #define SDA_PIN GPIO_Pin_7 #define SCL_PIN GPIO_Pin_6 #define SCL_H GPIOB->BSRR = GPIO_Pin_6 #define SCL_L GPIOB->BRR = GPIO_Pin_6 #define SDA_H GPIOB->BSRR = GPIO_Pin_7 #define SDA_L GPIOB->BRR = GPIO_Pin_7 #define SCL_read GPIOB->IDR & GPIO_Pin_6 #define SDA_read GPIOB->IDR & GPIO_Pin_7 /******************************************************************************* * File Name : SI2C.c * Author : zhang * Version : V1.0.0 * Date : 2011.12.08 *******************************************************************************/ #include "I2C.h" #include "stm32f10x.h" #include "stm32f10x_it.h" #include "main.h" vu8 FRAM_ADDRESS; /* function ------------------------------------------------------------------*/ /******************************************************************************* * Function Name : I2CInit * Description : I2CInit * Input : None * Output : None * Return : None *******************************************************************************/ void I2CInit(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //SDA GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); //SCL GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); SCL_H; SDA_H; } /******************************************************************************* * Function Name : I2C_delay * Description : I2C_delay * Input : None * Output : None * Return : None *******************************************************************************/ void I2C_delay(void) { //u8 i=200; //while(i) //{ // i--; //} Delay_us(10); } /******************************************************************************* * Function Name : I2C_Start * Description : I2C_Start * Input : None * Output : None * Return : None *******************************************************************************/ u8 I2C_Start(void) { SDA_H; SCL_H; I2C_delay(); if(!SDA_read)return FALSE; SDA_L; I2C_delay(); if(SDA_read) return FALSE; SCL_L; I2C_delay(); return TRUE; } /******************************************************************************* * Function Name : I2C_Stop * Description : I2C_Stop * Input : None * Output : None * Return : None *******************************************************************************/ void I2C_Stop(void) { SCL_L; I2C_delay(); SDA_L; I2C_delay(); SCL_H; I2C_delay(); SDA_H; I2C_delay(); } /******************************************************************************* * Function Name : I2C_Ack * Description : I2C_Ack * Input : None * Output : None * Return : None *******************************************************************************/ void I2C_Ack(void) { SCL_L; I2C_delay(); SDA_L; I2C_delay(); SCL_H; I2C_delay(); SCL_L; I2C_delay(); } /******************************************************************************* * Function Name : I2C_NoAck * Description : I2C_NoAck * Input : None * Output : None * Return : None *******************************************************************************/ void I2C_NoAck(void) { SCL_L; I2C_delay(); SDA_H; I2C_delay(); SCL_H; I2C_delay(); SCL_L; I2C_delay(); } /******************************************************************************* * Function Name : I2C_WaitAck * Description : I2C_WaitAck * Input : None * Output : None * Return : TRUE/FALSE *******************************************************************************/ u8 I2C_WaitAck(void) { SCL_L; I2C_delay(); SDA_H; I2C_delay(); SCL_H; I2C_delay(); if(SDA_read) { SCL_L; return FALSE; } SCL_L; return TRUE; } /******************************************************************************* * Function Name : I2C_SendByte * Description : I2C_SendByte * Input : SendByte * Output : None * Return : None *******************************************************************************/ void I2C_SendByte(u8 SendByte) { u8 i=8; while(i--) { SCL_L; I2C_delay(); if(SendByte&0x80) SDA_H; else SDA_L; SendByte<<=1; I2C_delay(); SCL_H; I2C_delay(); } SCL_L; } /******************************************************************************* * Function Name : I2C_ReceiveByte * Description : I2C_ReceiveByte * Input : None * Output : None * Return : ReceiveByte *******************************************************************************/ u8 I2C_ReceiveByte(void) { u8 i=8; u8 ReceiveByte=0; SDA_H; while(i--) { ReceiveByte<<=1; SCL_L; I2C_delay(); SCL_H; I2C_delay(); if(SDA_read) { ReceiveByte|=0x01; } } SCL_L; return ReceiveByte; } /******************************************************************************* * Function Name : I2C_FRAM_BufferWrite * Description : I2C_FRAM_BufferWrite * Input : * Output : None * Return : None *******************************************************************************/ u8 I2C_FRAM_BufferWrite(u8* pBuffer, u16 WriteAddr, u16 NumByteToWrite) { u8 Addr = 0, count = 0; Addr = (WriteAddr) / I2C_PageSize; count = (WriteAddr) % I2C_PageSize; Addr = Addr << 1; Addr = Addr & 0x0F; FRAM_ADDRESS = I2C1_SLAVE_ADDRESS7_W | Addr; if (!I2C_Start()) return FALSE; I2C_SendByte(FRAM_ADDRESS); if (!I2C_WaitAck()) { I2C_Stop(); //在这结束,无应答 return FALSE; } I2C_SendByte(count); I2C_WaitAck(); while(NumByteToWrite--) { I2C_SendByte(* pBuffer); I2C_WaitAck(); pBuffer++; } I2C_Stop(); return TRUE; } /******************************************************************************* * Function Name : I2C_FRAM_BufferRead * Description : I2C_FRAM_BufferRead * Input : * Output : None * Return : None *******************************************************************************/ u8 I2C_FRAM_BufferRead(u8* pBuffer, u16 WriteAddr, u16 NumByteToRead) { u8 Addr = 0, count = 0; Addr = WriteAddr / I2C_PageSize; count = WriteAddr % I2C_PageSize; Addr = Addr << 1; Addr = Addr & 0x0F; FRAM_ADDRESS = I2C1_SLAVE_ADDRESS7_R | Addr; if (!I2C_Start()) return FALSE; I2C_SendByte(FRAM_ADDRESS); if (!I2C_WaitAck()) { I2C_Stop(); return FALSE; } I2C_SendByte(count); I2C_WaitAck(); I2C_Start(); I2C_SendByte(FRAM_ADDRESS | 0x01); I2C_WaitAck(); while(NumByteToRead) { *pBuffer = I2C_ReceiveByte(); if(NumByteToRead == 1)I2C_NoAck(); else I2C_Ack(); pBuffer++; NumByteToRead--; } I2C_Stop(); return TRUE; } void main(void) { u8 BQ769_INITAdd[11] ={0x00,0x01,0x02,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b}; u8 BQ769_INITdata[11]={0x08,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xAC,0x97,0x19}; u8 BQ769_RegAdd[12] ={0x0c,0x0d,0x0e,0x0f,0x51}; u8 BQ769_Voltage[12] ={0}; bsp_init(); I2CInit(); I2C_FRAM_BufferWrite(BQ769_INITdata,BQ769_INITAdd[0],12); while(1) { I2C_FRAM_BufferRead(BQ769_Voltage,BQ769_RegAdd[0],10); Delay_us(500); } }
|
|
相关推荐
1个回答
|
|
我的也是收到到ACK信号
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1252 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1184 浏览 3 评论
2263 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1351 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1774 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 08:26 , Processed in 0.560679 second(s), Total 75, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号