中级会员
 
- 积分
- 374
- 金钱
- 374
- 注册时间
- 2016-6-8
- 在线时间
- 79 小时
|
1金钱
本帖最后由 我叫做大熙熙 于 2017-12-20 15:53 编辑
芯片:STM32F071CB
管脚定义:PB13 - I2C_SCL
PB14 - I2C_SDA
STM32F0 管脚复用说明
相关源码程序如下:
[mw_shl_code=c,true]void i2c_config()
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_5);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_5);
GPIO_Init(GPIOB,&(GPIO_InitTypeDef){
.GPIO_Mode = GPIO_Mode_AF,
.GPIO_OType = GPIO_OType_OD,
.GPIO_PuPd = GPIO_PuPd_UP,
.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14,
.GPIO_Speed = GPIO_Speed_2MHz});
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
I2C_Init(I2C2,&(I2C_InitTypeDef){
.I2C_Mode = I2C_Mode_SMBusHost,//I2C_Mode_I2C,
.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit,
.I2C_AnalogFilter = I2C_AnalogFilter_Disable,
.I2C_DigitalFilter = 0x00,
.I2C_OwnAddress1 = 0x00,
.I2C_Ack = I2C_Ack_Enable,
.I2C_Timing = I2C_TIMING}); //I2C TIMING计算器计算
I2C_Cmd(I2C2, ENABLE);
}
/* 写N字节数据 */
Error i2c_write_nBytes(uint8_t bytesNum,uint8_t *buffer)
{
i2cTimeout = I2C_TIME_OUT;
while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY) != RESET){
if((i2cTimeout--) == 0){
return ERROR_FLAG_BUSY;
}
}
I2C_TransferHandling(I2C2,SDP_ADDRESS,1,I2C_Reload_Mode,I2C_Generate_Start_Write); 注释(1) //这句运行完后IIC_ISR状态如下
i2cTimeout = I2C_TIME_OUT;
while(I2C_GetFlagStatus(I2C2,I2C_FLAG_TXIS) == RESET){ //问题出在这里,TXIS一直都是0(RESET)状态
if((i2cTimeout--) == 0){
return ERROR_FLAG_TXIS;
}
}
I2C_SendData(I2C2,SDP_ADDRESS);
i2cTimeout = I2C_TIME_OUT;
while(I2C_GetFlagStatus(I2C2,I2C_FLAG_TCR) == RESET){
if((i2cTimeout--) == 0){
return ERROR_FLAG_TCR;
}
}
I2C_TransferHandling(I2C2,SDP_ADDRESS,bytesNum,I2C_AutoEnd_Mode,I2C_No_StartStop);
for(uint8_t i = 0; i < bytesNum; i++){
i2cTimeout = I2C_TIME_OUT;
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_TXIS) == RESET){
if((i2cTimeout--) == 0){
return ERROR_FLAG_TXIS;
}
}
I2C_SendData(I2C2, buffer[bytesNum]);
}
i2cTimeout = I2C_TIME_OUT;
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_STOPF) == RESET){
if((i2cTimeout--) == 0){
return ERROR_FLAG_STOPF;
}
}
return ERROR_NONE;
}
[/mw_shl_code]
注释(1):ISR状态
IIC_ISR寄存器状态
想问一下大家有什么解决问题的建议吗?先谢过了
|
最佳答案
查看完整内容[请看2#楼]
用模拟i2c用模拟i2c用模拟i2c!
https://github.com/Prry/drivers-for-mcu
|