弹吉他的程序员 2019-11-26 11:38 采纳率: 0%
浏览 691

模拟IIC更改IO口以后,IIC设备读取数据失败

使用的是STM32F!03C8T6,然后用的是ADS1110芯片要读取AD值,IIC通信。之前调试的很稳定,但是因为需要更换IO口(由PB10,PB11换成了PA2,PA3)就没了反应。IIC底层代码使用的正点原子的代码。做了如下更改//IO方向设置//PA2,PA3
#define SDA_IN_2() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=8< #define SDA_OUT_2() {GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=3< //IO操作函数
#define IIC_SCL_2 PAout(2) //SCL
#define IIC_SDA_2 PAout(3) //SDA
#define READ_SDA_2 PAin(3) //输入SDA
//PB10,PB11
#define SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8< #define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}
//IO操作函数

#define IIC_SCL PBout(10) //SCL
#define IIC_SDA PBout(11) //SDA

#define READ_SDA PBin(11) //输入SDA

以下是ADS110代码
void ADS1110_config(void) //配置config寄存器
{
IIC_Start(); //控制SCL和SDA线实现IIC通讯的开始;
IIC_Send_Byte(0X90);

while(IIC_Wait_Ack())
{
printf("IICfailed\r\n");
break;
}
while(IIC_Wait_Ack())
{
printf("IICfailed\r\n");
break;
}
IIC_Stop();
}
void write_ads1110(u8 cmd)//写数据
{
IIC_Start();
IIC_Send_Byte(0X90); //ADS1110地址 写
while(IIC_Wait_Ack());
IIC_Send_Byte(cmd);
while(IIC_Wait_Ack());
IIC_Stop();
}

u16 read_ads1110(void)
{
if((adc_sr&0x80)==0)
{
IIC_Start();
IIC_Send_Byte(0x91); //ADS1110地址 读
while(IIC_Wait_Ack());
adc_hi = IIC_Read_Byte(1);
adc_lo = IIC_Read_Byte(1);
IIC_Stop();
adc_lo1=(adc_hi< if(adc_lo1>65535)adc_lo1-=65535;
}
return adc_lo1;
}

u8 read_sr(void)
{
IIC_Start();
IIC_Send_Byte(0x91); //ADS1110地址 读
while(IIC_Wait_Ack());
adc_hi = IIC_Read_Byte(1);
adc_lo = IIC_Read_Byte(1);
adc_sr=IIC_Read_Byte(1);
IIC_Stop();
return adc_sr;
}

  • 写回答

1条回答 默认 最新

  • HBLFC 2021-07-21 10:55
    关注

    0XFFFF0FFF这个也要改

    评论

报告相同问题?

悬赏问题

  • ¥15 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符