初中生
最后登录1970-1-1
在线时间 小时
注册时间2020-1-19
|
我照着火哥的代码写了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--);
}
|
|