野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14491|回复: 2

模拟i2c的问题

[复制链接]
发表于 2021-10-8 15:45:08 | 显示全部楼层 |阅读模式
我照着火哥的代码写了i2c驱动程序,但是读出来的数是读的时候发过去的读单元内存地址,发送读内存单元地址为6串口打出来就是6,数据写没写进去还不知道,麻烦火哥帮我看一下哪里的问题?我的程序是只写一个字节和只读一个字节,如果没有响应串口会打印出fail,但是我的串口没有打印响应fail,说明响应是对的,为什么会这样,


#include "stm32f10x.h"
#include "stdio.h"
#include "e2prom.h"
uint8_t buffer[1]={1};
uint8_t puffer[1]={5};
void main()
{

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

        uart1gpioconfig();
        USART1congfig();
        I2CGPIOconfig();
         writebyte(12,puffer[0]);
        ee_Delay(0x0fffff);
        readbytes(6,buffer);
//        printf("%x",temp);
//        printf("dsajhdsa");
        while(1);
}
int fputc(int ch, FILE *f)
{
                /* 发送一个字节数据到串口 */
                USART_SendData(  USART1, (uint8_t) ch);
               
                /* 等待发送完毕 */
                while (USART_GetFlagStatus(  USART1, USART_FLAG_TXE) == RESET);               
       
                return (ch);
}
void USART1congfig(void){

USART_InitTypeDef USart_InitStructure;
USart_InitStructure.USART_BaudRate=115200;
USart_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None     ;
USart_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx    ;
USart_InitStructure.USART_Parity=USART_Parity_No   ;
USart_InitStructure.USART_StopBits=USART_StopBits_1 ;
USart_InitStructure.USART_WordLength=USART_WordLength_8b ;
USART_Init(USART1, &USart_InitStructure);
USART_Cmd( USART1,ENABLE);
        }


void uart1gpioconfig(void){
        GPIO_InitTypeDef GPIO_InitStructure;
         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5 ;  
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);                         


       
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 ;  
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10 ;  

GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void I2CGPIOconfig()
{
GPIO_InitTypeDef GPIO_InitStructure;
         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6 ;  
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);                         


       
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7 ;  
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void start()
{GPIO_SetBits(GPIOB, GPIO_Pin_7);
        GPIO_SetBits(GPIOB, GPIO_Pin_6);
i2c_Delay();
GPIO_ResetBits(GPIOB, GPIO_Pin_7);
i2c_Delay();
        GPIO_ResetBits(GPIOB, GPIO_Pin_6);
        i2c_Delay();
}
void stop()
{GPIO_SetBits(GPIOB, GPIO_Pin_6);
GPIO_ResetBits(GPIOB, GPIO_Pin_7);
        i2c_Delay();
        GPIO_SetBits(GPIOB, GPIO_Pin_7);
        i2c_Delay();
}
void ack()
{GPIO_ResetBits(GPIOB, GPIO_Pin_6);
        GPIO_SetBits(GPIOB, GPIO_Pin_7);
i2c_Delay();
GPIO_ResetBits(GPIOB, GPIO_Pin_7);
i2c_Delay();
        GPIO_SetBits(GPIOB, GPIO_Pin_6);
        i2c_Delay();
        GPIO_ResetBits(GPIOB, GPIO_Pin_6);
        i2c_Delay();
        GPIO_SetBits(GPIOB, GPIO_Pin_7);
        i2c_Delay();
}
void i2c_NAck(void)
{
//GPIO_ResetBits(GPIOB, GPIO_Pin_6);
        GPIO_SetBits(GPIOB, GPIO_Pin_7);
i2c_Delay();
        GPIO_SetBits(GPIOB, GPIO_Pin_6);
i2c_Delay();
        GPIO_ResetBits(GPIOB, GPIO_Pin_6);
        i2c_Delay();
}
uint8_t res;
uint8_t waitack()
{
       
        GPIO_SetBits(GPIOB, GPIO_Pin_7);
i2c_Delay();
        GPIO_SetBits(GPIOB, GPIO_Pin_6);
i2c_Delay();
        if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)==SET)
        {res=1;
        printf("fail");
        }
        if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)==RESET)
        res=0;
       
        GPIO_ResetBits(GPIOB, GPIO_Pin_6);
        i2c_Delay();
        return res;
}
int i=0;
void sendbyte(uint8_t byte)
{
        for(i=0;i<8;i++)
{if(byte&0x80)
        GPIO_SetBits(GPIOB, GPIO_Pin_7);
else
        GPIO_ResetBits(GPIOB, GPIO_Pin_7);
        i2c_Delay();
GPIO_SetBits(GPIOB, GPIO_Pin_6);
i2c_Delay();
GPIO_ResetBits(GPIOB, GPIO_Pin_6);
if(i==7)
GPIO_SetBits(GPIOB, GPIO_Pin_7);
//i2c_Delay();
byte<<=1;
i2c_Delay();
}

}
int n=0;
uint8_t value=0;
uint8_t readbyte(void)
{
       
        for(n=0;n<8;n++)
{value<<=1;
        GPIO_SetBits(GPIOB, GPIO_Pin_6);
        i2c_Delay();
        if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7))
        value++;
        GPIO_ResetBits(GPIOB, GPIO_Pin_6);
        i2c_Delay();
//value<<=1;
}
return value;
}
void writebyte( uint8_t addr,uint8_t data)
{
        stop();
        start();
        sendbyte(0xA0);
waitack();
//        if (waitack()==1) printf("fail");
        sendbyte( (uint8_t )addr);
         waitack();
        sendbyte(data);
        waitack();
        stop();
}
void readbytes(uint8_t addr,uint8_t *fuffer)
{uint8_t temp=0;
        start();
sendbyte(0xA0);
waitack();
       
sendbyte((uint8_t)addr);
waitack();
       
start();
        sendbyte(0xA1);
        waitack();
       
*fuffer=readbyte();
        i2c_NAck();
        stop();
       
}
static void i2c_Delay(void)
{
        uint8_t i;

       
        for (i = 0; i < 10; i++);
}
void ee_Delay(uint32_t nCount)         //简单的延时函数
{
        for(; nCount != 0; nCount--);
}


回复

使用道具 举报

发表于 2021-10-9 11:00:41 | 显示全部楼层
写页有问题么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-9 11:42:59 | 显示全部楼层

我这是写一个字节读一个字节,都没做页写,先能写一个读一个,在考虑连续写啊,大神帮我看看哪里的问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-28 06:50 , Processed in 0.042984 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表