中级会员
 
- 积分
- 215
- 金钱
- 215
- 注册时间
- 2018-12-15
- 在线时间
- 40 小时
|
发表于 2019-8-12 20:21:28
|
显示全部楼层
你好 我在做毕业设计 现在用STM32L071RBT6与24C128N间进行iic通讯,用的是模拟,通讯不上,我看不出我的问题在哪里了 能麻烦你帮忙看一下么 这是我的代码 方便的话能把你的代码发我一下么
- //iic.h
- #ifndef _MYIIC_H
- #define _MYIIC_H
- #include "sys.h"
- //IO·½ÏòÉèÖÃ
- #define SDA_IN() {GPIOB->MODER&=~(3<<(9*2));GPIOH->MODER|=0<<(9*2);} //PB9ÊäÈëģʽ
- #define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOH->MODER|=1<<(9*2);} //PB9Êä³öģʽ
- /*
- #define SDA_IN() {GPIOC->MODER&=~(3<<(1*2));GPIOH->MODER|=0<<1*2;} //PC1ÊäÈëģʽ
- #define SDA_OUT() {GPIOC->MODER&=~(3<<(1*2));GPIOH->MODER|=1<<1*2;} //PC1Êä³öģʽ
- */
- //IO²Ù×÷
- #define IIC_SCL_1 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET) //SCL¸ßµçƽ--PC0
- #define IIC_SCL_0 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET) //SCLµÍµçƽ
- #define IIC_SDA_1 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET)//SDA¸ßµçƽ--PC1
- #define IIC_SDA_0 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET)
- #define READ_SDA HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)//¶ÁÈ¡SDAÉϵÄÐźÅ
- /*
- #define IIC_SCL_1 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET) //SCL¸ßµçƽ--PC0
- #define IIC_SCL_0 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET) //SCLµÍµçƽ
- #define IIC_SDA_1 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET)//SDA¸ßµçƽ--PC1
- #define IIC_SDA_0 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_RESET)
- #define READ_SDA HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_1)//¶ÁÈ¡SDAÉϵÄÐźÅ
- */
- //IICËùÓвÙ×÷º¯Êý
- void IIC_Init(void); //³õʼ»¯IICµÄIO¿Ú
- void IIC_Start(void); //·¢ËÍIIC¿ªÊ¼ÐźÅ
- void IIC_Stop(void); //·¢ËÍIICÍ£Ö¹ÐźÅ
- void IIC_Send_Byte(uint8_t txd); //IIC·¢ËÍÒ»¸ö×Ö½Ú
- uint8_t IIC_Read_Byte(unsigned char ack);//IIC¶Áȡһ¸ö×Ö½Ú
- uint8_t IIC_Wait_Ack(void); //IICµÈ´ýACKÐźÅ
- void IIC_Ack(void); //IIC·¢ËÍACKÐźÅ
- void IIC_NAck(void); //IIC²»·¢ËÍACKÐźÅ
- void IIC_Write_One_Byte(uint8_t daddr,uint8_t addr,uint8_t data);
- uint8_t IIC_Read_One_Byte(uint8_t daddr,uint8_t addr);
- #endif
- //iic.c
- #include "myiic.h"
- #include "delay.h"
- void IIC_Init(void)
- {
- GPIO_InitTypeDef GPIO_Initure;
-
- __HAL_RCC_GPIOB_CLK_ENABLE(); //ʹÄÜGPIOBʱÖÓ
-
- //PB8,9³õʼ»¯ÉèÖÃ
- GPIO_Initure.Pin=GPIO_PIN_8|GPIO_PIN_9;
- GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //ÍÆÍìÊä³ö
- GPIO_Initure.Pull=GPIO_PULLUP; //ÉÏÀ­
- GPIO_Initure.Speed=GPIO_SPEED_FAST; //¿ìËÙ
- HAL_GPIO_Init(GPIOB,&GPIO_Initure);
-
- IIC_SDA_1;
- IIC_SCL_1;
- printf("iic init\r\n");
-
- /*
- __HAL_RCC_GPIOC_CLK_ENABLE(); //ʹÄÜGPIOCʱÖÓ
-
- //PC0,1³õʼ»¯ÉèÖÃ
- GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1;
- GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //ÍÆÍìÊä³ö
- GPIO_Initure.Pull=GPIO_PULLUP; //ÉÏÀ­
- GPIO_Initure.Speed=GPIO_SPEED_FAST; //¿ìËÙ
- HAL_GPIO_Init(GPIOC,&GPIO_Initure);
-
- IIC_SDA_1;
- IIC_SCL_1;
- */
- }
- //²úÉúIICÆðʼÐźÅ
- void IIC_Start(void)
- {
- SDA_OUT(); //sdaÏßÊä³ö
- IIC_SDA_1;
- IIC_SCL_1;
- delay_us(4);
- IIC_SDA_0;//START:when CLK is high,DATA change form high to low
- delay_us(4);
- IIC_SCL_0;//ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý
- printf("start\r\n");
- }
- //²úÉúIICÍ£Ö¹ÐźÅ
- void IIC_Stop(void)
- {
- SDA_OUT();//sdaÏßÊä³ö
- IIC_SCL_0;
- IIC_SDA_0;//STOP:when CLK is high DATA change form low to high
- delay_us(4);
- IIC_SCL_1;
- IIC_SDA_1;//·¢ËÍI2C×ÜÏß½áÊøÐźÅ
- delay_us(4);
- printf("stop\r\n");
- }
- //µÈ´ýÓ¦´ðÐźŵ½À´
- //·µ»ØÖµ£º1£¬½ÓÊÕÓ¦´ðʧ°Ü
- // 0£¬½ÓÊÕÓ¦´ð³É¹¦
- uint8_t IIC_Wait_Ack(void)
- {
- uint16_t ucErrTime=0;
- SDA_IN(); //SDAÉèÖÃΪÊäÈë
- IIC_SDA_1;delay_us(1);
- IIC_SCL_1;delay_us(1);
- while(READ_SDA)
- {
- ucErrTime++;
- if(ucErrTime>500)
- {
- IIC_Stop();
- return 1;
- }
- }
- IIC_SCL_0;//ʱÖÓÊä³ö0
- printf("wait ack\r\n");
- return 0;
-
- }
- //²úÉúACKÓ¦´ð
- void IIC_Ack(void)
- {
- IIC_SCL_0;
- SDA_OUT();
- IIC_SDA_0;
- delay_us(2);
- IIC_SCL_1;
- delay_us(2);
- IIC_SCL_0;
- printf("ack\r\n");
- }
- //²»²úÉúACKÓ¦´ð
- void IIC_NAck(void)
- {
- IIC_SCL_0;
- SDA_OUT();
- IIC_SDA_1;
- delay_us(2);
- IIC_SCL_1;
- delay_us(2);
- IIC_SCL_0;
- printf("nack\r\n");
- }
- //IIC·¢ËÍÒ»¸ö×Ö½Ú
- //·µ»Ø´Ó»úÓÐÎÞÓ¦´ð
- //1£¬ÓÐÓ¦´ð
- //0£¬ÎÞÓ¦´ð
- void IIC_Send_Byte(uint8_t txd)
- {
- uint8_t t;
- SDA_OUT();
- IIC_SCL_0;//À­µÍʱÖÓ¿ªÊ¼Êý¾Ý´«Êä
- for(t=0;t<8;t++)
- {
- //IIC_SDA=(txd&0x80)>>7;
- if((txd&0x80)>>7)
- {
- IIC_SDA_1;
- printf("1");
- }
- else
- {
- IIC_SDA_0;
- printf("0");
- }
-
-
- txd<<=1;
- delay_us(2); //¶ÔTEA5767ÕâÈý¸öÑÓʱ¶¼ÊDZØÐëµÄ
- IIC_SCL_1;
- delay_us(2);
- IIC_SCL_0;
- delay_us(2);
- }
- printf("sendbyte\r\n");
- }
- //¶Á1¸ö×Ö½Ú£¬ack=1ʱ£¬·¢ËÍACK£¬ack=0£¬·¢ËÍnACK
- uint8_t IIC_Read_Byte(unsigned char ack)
- {
- unsigned char i,receive=0;
- SDA_IN();//SDAÉèÖÃΪÊäÈë
- for(i=0;i<8;i++ )
- {
- IIC_SCL_0;
- delay_us(2);
- IIC_SCL_1;
- receive<<=1;
- if(READ_SDA) receive++;
- delay_us(1);
- }
- if (!ack)
- IIC_NAck();//·¢ËÍnACK
- else
- IIC_Ack(); //·¢ËÍACK
- printf("iicreadbyte receive:%d\r\n",receive);
- return receive;
- }
- //24cxx.c
- #include "24cxx.h"
- #include "delay.h"
- #include "usart4.h"
- //////////////////////////////////////////////////////////////////////////////////
- //±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
- //ALIENTEK STM32F429¿ª·¢°å
- //24CXXÇý¶¯´úÂë
- //ÕýµãÔ­×Ó@ALIENTEK
- //¼¼ÊõÂÛ̳:www.openedv.com
- //´´½¨ÈÕÆÚ:2016/1/13
- //°æ±¾£ºV1.0
- //°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
- //Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2014-2024
- //All rights reserved
- //////////////////////////////////////////////////////////////////////////////////
- //³õʼ»¯IIC½Ó¿Ú
- void AT24CXX_Init(void)
- {
- IIC_Init();//IIC³õʼ»¯
- //bsp_iic_init();
- }
- //ÔÚAT24CXXÖ¸¶¨µØÖ·¶Á³öÒ»¸öÊý¾Ý
- //ReadAddr:¿ªÊ¼¶ÁÊýµÄµØÖ·
- //·µ»ØÖµ :¶Áµ½µÄÊý¾Ý
- u8 AT24CXX_ReadOneByte(u16 ReadAddr)
- {
- u8 temp=0;
- IIC_Start();
- if(EE_TYPE>AT24C16)
- {
- IIC_Write_Byte(0XA0); //·¢ËÍдÃüÁî
- IIC_Wait_Ack();
- IIC_Write_Byte(ReadAddr>>8);//·¢Ë͸ߵØÖ·
- }else IIC_Write_Byte(0XA0+((ReadAddr/256)<<1)); //·¢ËÍÆ÷¼þµØÖ·0XA0,дÊý¾Ý
- IIC_Wait_Ack();
- IIC_Write_Byte(ReadAddr%256); //·¢Ë͵͵ØÖ·
- IIC_Wait_Ack();
- IIC_Start();
- IIC_Write_Byte(0XA1); //½øÈë½ÓÊÕģʽ
- IIC_Wait_Ack();
- temp=IIC_Read_Byte();
- IIC_Stop();//²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
- printf("read one byte is:%d\r\n",temp);
- return temp;
- }
- //ÔÚAT24CXXÖ¸¶¨µØÖ·Ð´ÈëÒ»¸öÊý¾Ý
- //WriteAddr :дÈëÊý¾ÝµÄÄ¿µÄµØÖ·
- //DataToWrite:ҪдÈëµÄÊý¾Ý
- void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
- {
- IIC_Start();
- if(EE_TYPE>AT24C16)
- {
- IIC_Write_Byte(0XA0); //·¢ËÍдÃüÁî
- IIC_Wait_Ack();
- IIC_Write_Byte(WriteAddr>>8);//·¢Ë͸ߵØÖ·
- }else IIC_Write_Byte(0XA0+((WriteAddr/256)<<1)); //·¢ËÍÆ÷¼þµØÖ·0XA0,дÊý¾Ý
- IIC_Wait_Ack();
- IIC_Write_Byte(WriteAddr%256); //·¢Ë͵͵ØÖ·
- IIC_Wait_Ack();
- IIC_Write_Byte(DataToWrite); //·¢ËÍ×Ö½Ú
- IIC_Wait_Ack();
- IIC_Stop();//²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ
- delay_ms(1);
- }
- //ÔÚAT24CXXÀïÃæµÄÖ¸¶¨µØÖ·¿ªÊ¼Ð´È볤¶ÈΪLenµÄÊý¾Ý
- //¸Ãº¯ÊýÓÃÓÚдÈë16bit»òÕß32bitµÄÊý¾Ý.
- //WriteAddr :¿ªÊ¼Ð´ÈëµÄµØÖ·
- //DataToWrite:Êý¾ÝÊý×éÊ×µØÖ·
- //Len :ҪдÈëÊý¾ÝµÄ³¤¶È2,4
- void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
- {
- u8 t;
- for(t=0;t<Len;t++)
- {
- AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
- }
- }
- //ÔÚAT24CXXÀïÃæµÄÖ¸¶¨µØÖ·¿ªÊ¼¶Á³ö³¤¶ÈΪLenµÄÊý¾Ý
- //¸Ãº¯ÊýÓÃÓÚ¶Á³ö16bit»òÕß32bitµÄÊý¾Ý.
- //ReadAddr :¿ªÊ¼¶Á³öµÄµØÖ·
- //·µ»ØÖµ :Êý¾Ý
- //Len :Òª¶Á³öÊý¾ÝµÄ³¤¶È2,4
- u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
- {
- u8 t;
- u32 temp=0;
- for(t=0;t<Len;t++)
- {
- temp<<=8;
- temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);
- }
- return temp;
- }
- //¼ì²éAT24CXXÊÇ·ñÕý³£
- //ÕâÀïÓÃÁË24XXµÄ×îºóÒ»¸öµØÖ·(255)À´´æ´¢±êÖ¾×Ö.
- //Èç¹ûÓÃÆäËû24CϵÁÐ,Õâ¸öµØÖ·ÒªÐÞ¸Ä
- //·µ»Ø1:¼ì²âʧ°Ü
- //·µ»Ø0:¼ì²â³É¹¦
- u8 AT24CXX_Check(void)
- {
- u8 temp;
- temp=AT24CXX_ReadOneByte(255);//±ÜÃâÿ´Î¿ª»ú¶¼Ð´AT24CXX
- if(temp==0X55)return 0;
- else//ÅųýµÚÒ»´Î³õʼ»¯µÄÇé¿ö
- {
- AT24CXX_WriteOneByte(255,0X55);
- temp=AT24CXX_ReadOneByte(255);
- if(temp==0X55)return 0;
- }
- return 1;
- }
- //ÔÚAT24CXXÀïÃæµÄÖ¸¶¨µØÖ·¿ªÊ¼¶Á³öÖ¸¶¨¸öÊýµÄÊý¾Ý
- //ReadAddr :¿ªÊ¼¶Á³öµÄµØÖ· ¶Ô24c02Ϊ0~255
- //pBuffer :Êý¾ÝÊý×éÊ×µØÖ·
- //NumToRead:Òª¶Á³öÊý¾ÝµÄ¸öÊý
- void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
- {
- while(NumToRead)
- {
- *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
- NumToRead--;
- }
- }
- //ÔÚAT24CXXÀïÃæµÄÖ¸¶¨µØÖ·¿ªÊ¼Ð´ÈëÖ¸¶¨¸öÊýµÄÊý¾Ý
- //WriteAddr :¿ªÊ¼Ð´ÈëµÄµØÖ· ¶Ô24c02Ϊ0~255
- //pBuffer :Êý¾ÝÊý×éÊ×µØÖ·
- //NumToWrite:ҪдÈëÊý¾ÝµÄ¸öÊý
- void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
- {
- while(NumToWrite--)
- {
- AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
- WriteAddr++;
- pBuffer++;
- }
- }
- //24cxx.h
- #ifndef _24CXX_H
- #define _24CXX_H
- #include "sys.h"
- #include "myiic.h"
- //#include "bsp_iic.h"
- //////////////////////////////////////////////////////////////////////////////////
- //±¾³ÌÐòÖ»¹©Ñ§Ï°Ê¹Óã¬Î´¾­×÷ÕßÐí¿É£¬²»µÃÓÃÓÚÆäËüÈκÎÓÃ;
- //ALIENTEK STM32F429¿ª·¢°å
- //SDRAMÇý¶¯´úÂë
- //ÕýµãÔ­×Ó@ALIENTEK
- //¼¼ÊõÂÛ̳:www.openedv.com
- //´´½¨ÈÕÆÚ:2016/1/13
- //°æ±¾£ºV1.0
- //°æÈ¨ËùÓУ¬µÁ°æ±Ø¾¿¡£
- //Copyright(C) ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ 2014-2024
- //All rights reserved
- //////////////////////////////////////////////////////////////////////////////////
- #define AT24C01 127
- #define AT24C02 255
- #define AT24C04 511
- #define AT24C08 1023
- #define AT24C16 2047
- #define AT24C32 4095
- #define AT24C64 8191
- #define AT24C128 16383
- #define AT24C256 32767
- //STM32F429¿ª·¢°åʹÓõÄÊÇ24c02£¬ËùÒÔ¶¨ÒåEE_TYPEΪAT24C02
- #define EE_TYPE AT24C128
-
- u8 AT24CXX_ReadOneByte(u16 ReadAddr); //Ö¸¶¨µØÖ·¶Áȡһ¸ö×Ö½Ú
- void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite); //Ö¸¶¨µØÖ·Ð´ÈëÒ»¸ö×Ö½Ú
- void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len);//Ö¸¶¨µØÖ·¿ªÊ¼Ð´ÈëÖ¸¶¨³¤¶ÈµÄÊý¾Ý
- u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len); //Ö¸¶¨µØÖ·¿ªÊ¼¶Áȡָ¶¨³¤¶ÈÊý¾Ý
- void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite); //´ÓÖ¸¶¨µØÖ·¿ªÊ¼Ð´ÈëÖ¸¶¨³¤¶ÈµÄÊý¾Ý
- void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead); //´ÓÖ¸¶¨µØÖ·¿ªÊ¼¶Á³öÖ¸¶¨³¤¶ÈµÄÊý¾Ý
- u8 AT24CXX_Check(void); //¼ì²éÆ÷¼þ
- void AT24CXX_Init(void); //³õʼ»¯IIC
- #endif
复制代码
|
|