打印

英飞凌单片机

[复制链接]
1276|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
诗骆璇|  楼主 | 2017-3-10 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近需要用到xmc1100  读写eeprom  而且用的是软件模拟 定义scl  sda   但是似乎写不进去  请教懂得大神
代码如下  用的是stm32 的eeprom读写

//IO方向设置  ---xmc
#define SDA_IN()           P0_1_set_mode(INPUT);//输入
#define SDA_OUT()  P0_1_set_mode(OUTPUT_PP_GP) //输出

//IO操作函数          ----xmc
#define IIC_SCL_1     P0_0_set() //SCL   
#define IIC_SDA_1     P0_1_set() //SDA         
#define IIC_SCL_0     P0_0_reset() //SCL   
#define IIC_SDA_0     P0_1_reset() //SDA         

#define READ_SDA      P0_1_read() //输入  读
//#define READ_SDA      P0_1_set_mode(INPUT)//输入 读

其他的读写函数 均与stm32 类似  求教配置问题
void IIC_Init(void)
{                       
//GPIO_InitTypeDef  GPIO_InitStructure;

//RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//ʹÄÜGPIOBʱÖÓ

//  //GPIOB8,B9³õʼ»¯ÉèÖÃ
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//ÆÕͨÊä³öģʽ
//  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍìÊä³ö
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
//  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ­
//  GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯
//        IIC_SCL=1;
//        IIC_SDA=1;

        P0_0_set_mode(OUTPUT_PP_GP);//    SCL   ÕâÀïͨÓÃÍÆÍìÊä³ö    ûÓÐÉÏÀ­Ñ¡Ïî
        P0_1_set_mode(OUTPUT_PP_GP);         // SDA   ÕâÀïͨÓÃÍÆÍìÊä³ö   
        IIC_SCL_1;//P0_0_set  Ä¬ÈÏÊä³ö¸ßµçƽ
        IIC_SDA_1;//P0_1_set
}
//²úÉúIICÆðʼÐźÅ
void IIC_Start(void)
{
        SDA_OUT();     //sdaÏßÊä³ö
        IIC_SDA_1;   //P0_1_set                    
        IIC_SCL_1;    //P0_0_set
        delay_us(4);
        IIC_SDA_0;//START:when CLK is high,DATA change form high to low
        delay_us(4);
        IIC_SCL_0;//ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý
}          
//²úÉú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);                                                                  
}
//µÈ´ýÓ¦´ðÐźŵ½À´
//·µ»ØÖµ£º1£¬½ÓÊÕÓ¦´ðʧ°Ü
//        0£¬½ÓÊÕÓ¦´ð³É¹¦
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      //SDAÉèÖÃΪÊäÈë  
        IIC_SDA_1;delay_us(1);          
        IIC_SCL_1;delay_us(1);         
        while(READ_SDA)//READ_SDA
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL_0;//ʱÖÓÊä³ö0           
        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;
}
//²»²úÉú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;
}                                                                              
//IIC·¢ËÍÒ»¸ö×Ö½Ú
//·µ»Ø´Ó»úÓÐÎÞÓ¦´ð
//1£¬ÓÐÓ¦´ð
//0£¬ÎÞÓ¦´ð
u8  num_addr;
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
        SDA_OUT();             
    IIC_SCL_0;//À­µÍʱÖÓ¿ªÊ¼Êý¾Ý´«Êä
    for(t=0;t<8;t++)
    {     
      num_addr = (txd&0x80)>>7; //×ÔÐÞ¸Ä
         if(num_addr==0)
                          {
                                    IIC_SDA_0;
                          }
                                else if(num_addr == 1)
                                          IIC_SDA_1;
        txd<<=1;           
                delay_us(2);   //¶ÔTEA5767ÕâÈý¸öÑÓʱ¶¼ÊDZØÐëµÄ
                IIC_SCL_1;
                delay_us(2);
                IIC_SCL_0;       
                delay_us(2);
    }         
}             
//¶Á1¸ö×Ö½Ú£¬ack=1ʱ£¬·¢ËÍACK£¬ack=0£¬·¢ËÍnACK   
u8 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)//sdaÉèΪÊäÈë
                                        receive++;   
                delay_us(1);
    }                                         
    if (!ack)
        IIC_NAck();//·¢ËÍnACK
    else
        IIC_Ack(); //·¢ËÍACK   
    return receive;
}

void delay_us(u8 num) // usÑÓʱ
{
           for(int i=0; i<num; i++)
                        {
                                        __nop;
                        }
}

void  delay_ms(u8 num)//   msÑÓʱ  
{
        for(int i =0 ; i<num; i++)
        {
                        for(int j =0; j<1000;j++)
                        {
                                        delay_us(1);
                        }
  }
}

相关帖子

沙发
dirtwillfly| | 2017-3-10 11:01 | 只看该作者
建议先观察下时序图吧。代码看不出什么的,时序是关键

使用特权

评论回复
板凳
诗骆璇|  楼主 | 2017-3-10 11:03 | 只看该作者
dirtwillfly 发表于 2017-3-10 11:01
建议先观察下时序图吧。代码看不出什么的,时序是关键

谢谢

使用特权

评论回复
地板
诗骆璇|  楼主 | 2017-3-10 13:14 | 只看该作者
已找到问题   谢谢

使用特权

评论回复
5
dirtwillfly| | 2017-3-12 10:16 | 只看该作者
诗骆璇 发表于 2017-3-10 13:14
已找到问题   谢谢

解决了就好。请及时结贴,结贴方法https://bbs.21ic.com/icview-442857-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝