Thông báo

Collapse
No announcement yet.

Cùng nhau trao đổi về STM8

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Chào mọi người, mình đang code giao tiếp I2C trên STM8S003F3 nhưng gặp lỗi. Đầu tiên mình khởi tạo xung clock
    Code:
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
    	
    	CLK_PeripheralClockConfig(TCS34725_I2C_CLK, ENABLE);
    	/* I2C configuration */
      /* sEE_I2C Peripheral Enable */
      I2C_Cmd( ENABLE);
      /* sEE_I2C configuration after enabling it */
      I2C_Init(I2C_MAX_FAST_FREQ, TCS34725_ADDRESS7, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
    Sau đó đọc I2C thì bị lỗi:

    Code:
    TCS34725_TimeOut = DEFAULT_TIMEOUT;
    	while(I2C_GetFlagStatus( I2C_FLAG_BUSBUSY))
      {
        if((TCS34725_TimeOut--) == 0) return 99;
      }
    	
    	I2C_GenerateSTART(ENABLE);
    	I2C_Send7bitAddress(TCS34725_ADDRESS7, TCS34725_DIRECTION_TX);
    	
    	/* Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */
      TCS34725_TimeOut = DEFAULT_TIMEOUT;
      while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT))
      {
        if((TCS34725_TimeOut--) == 0) return 88;
      }
    	
    	/* Test on EV6 and clear it */
      TCS34725_TimeOut = DEFAULT_TIMEOUT;
      while(!I2C_CheckEvent( I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
      {
        if((TCS34725_TimeOut--) == 0) return 77;
      } 
    	
    	/* Test on EV8 and clear it */
      TCS34725_TimeOut = DEFAULT_TIMEOUT;
      while(I2C_GetFlagStatus(I2C_FLAG_TRANSFERFINISHED) == RESET)
      {
        if((TCS34725_TimeOut--) == 0) return 66;
      }
      
      /* Send START condition a second time */  
      I2C_GenerateSTART( ENABLE);
      
      /* Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */
      TCS34725_TimeOut = DEFAULT_TIMEOUT;
      while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT))
      {
        if((TCS34725_TimeOut--) == 0) return 55;
      } 
      
      /* Send EEPROM address for read */
      //I2C_Send7bitAddress(TCS34725_ADDRESS7 , I2C_DIRECTION_RX);
    	I2C_Send7bitAddress(addr , I2C_DIRECTION_RX);
    	
    	
    	/* Wait on ADDR flag to be set (ADDR is still not cleared at this level */
    		TCS34725_TimeOut = DEFAULT_TIMEOUT;
        while(I2C_GetFlagStatus( I2C_FLAG_ADDRESSSENTMATCHED) == RESET)
        {
          if((TCS34725_TimeOut--) == 0) return 44;
        } 
           
        /* Disable Acknowledgement */
        I2C_AcknowledgeConfig(I2C_ACK_NONE);   
    
        /* Call User callback for critical section start (should typically disable interrupts) */
        //sEE_EnterCriticalSection_UserCallback();
        
        /* Clear ADDR register by reading SR1 then SR3 register (SR1 has already been read) */
        (void)TCS34725_I2C->SR3;
        
        /* Send STOP Condition */
        I2C_GenerateSTOP( ENABLE);
       
        /* Call User callback for critical section end (should typically re-enable interrupts) */
        //sEE_ExitCriticalSection_UserCallback();
        
        /* Wait for the byte to be received */
        TCS34725_TimeOut = DEFAULT_TIMEOUT;
        while(I2C_GetFlagStatus( I2C_FLAG_RXNOTEMPTY) == RESET)
        {
          if((TCS34725_TimeOut--) == 0) return 33;
        }
        
        /* Read the byte received from the EEPROM */
        tmp = I2C_ReceiveData();
        
        /* Decrement the read bytes counter */
        //(uint16_t)(*NumByteToRead)--;        
        
        /* Wait to make sure that STOP control bit has been cleared */
        TCS34725_TimeOut = DEFAULT_TIMEOUT;
        while(TCS34725_I2C->CR2 & I2C_CR2_STOP)
        {
          if((TCS34725_TimeOut--) == 0) return 22;
        }  
        
        /* Re-Enable Acknowledgement to be ready for another reception */
        I2C_AcknowledgeConfig( I2C_ACK_CURR);
    Sau khi I2C_GenerateSTART(ENABLE); thì nó báo cờ I2C_FLAG_BUSBUSY, nhờ các tiền bối gỡ giúp lỗi này.

    Mạch kết nối 2 ngoại vi i2c trên cùng 1 bus, điạ chỉ lần lượt là 0x29 và 0x39.

    Comment


    • chào anh e! cho mình hỏi:
      làm thế nào để biết dung lượng code mình đang viết cho tm8s vậy? Mình đang dùng STVD và STVP
      Cảm ơn các anh e trước nha!

      Comment


      • Nguyên văn bởi vaa_dtvn Xem bài viết
        Chào mọi người, mình đang code giao tiếp I2C trên STM8S003F3 nhưng gặp lỗi. Đầu tiên mình khởi tạo xung clock
        Code:
        CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
        	
        	CLK_PeripheralClockConfig(TCS34725_I2C_CLK, ENABLE);
        	/* I2C configuration */
          /* sEE_I2C Peripheral Enable */
          I2C_Cmd( ENABLE);
          /* sEE_I2C configuration after enabling it */
          I2C_Init(I2C_MAX_FAST_FREQ, TCS34725_ADDRESS7, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
        Sau đó đọc I2C thì bị lỗi:

        Code:
        TCS34725_TimeOut = DEFAULT_TIMEOUT;
        	while(I2C_GetFlagStatus( I2C_FLAG_BUSBUSY))
          {
            if((TCS34725_TimeOut--) == 0) return 99;
          }
        	
        	I2C_GenerateSTART(ENABLE);
        	I2C_Send7bitAddress(TCS34725_ADDRESS7, TCS34725_DIRECTION_TX);
        	
        	/* Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */
          TCS34725_TimeOut = DEFAULT_TIMEOUT;
          while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT))
          {
            if((TCS34725_TimeOut--) == 0) return 88;
          }
        	
        	/* Test on EV6 and clear it */
          TCS34725_TimeOut = DEFAULT_TIMEOUT;
          while(!I2C_CheckEvent( I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
          {
            if((TCS34725_TimeOut--) == 0) return 77;
          } 
        	
        	/* Test on EV8 and clear it */
          TCS34725_TimeOut = DEFAULT_TIMEOUT;
          while(I2C_GetFlagStatus(I2C_FLAG_TRANSFERFINISHED) == RESET)
          {
            if((TCS34725_TimeOut--) == 0) return 66;
          }
          
          /* Send START condition a second time */  
          I2C_GenerateSTART( ENABLE);
          
          /* Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */
          TCS34725_TimeOut = DEFAULT_TIMEOUT;
          while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT))
          {
            if((TCS34725_TimeOut--) == 0) return 55;
          } 
          
          /* Send EEPROM address for read */
          //I2C_Send7bitAddress(TCS34725_ADDRESS7 , I2C_DIRECTION_RX);
        	I2C_Send7bitAddress(addr , I2C_DIRECTION_RX);
        	
        	
        	/* Wait on ADDR flag to be set (ADDR is still not cleared at this level */
        		TCS34725_TimeOut = DEFAULT_TIMEOUT;
            while(I2C_GetFlagStatus( I2C_FLAG_ADDRESSSENTMATCHED) == RESET)
            {
              if((TCS34725_TimeOut--) == 0) return 44;
            } 
               
            /* Disable Acknowledgement */
            I2C_AcknowledgeConfig(I2C_ACK_NONE);   
        
            /* Call User callback for critical section start (should typically disable interrupts) */
            //sEE_EnterCriticalSection_UserCallback();
            
            /* Clear ADDR register by reading SR1 then SR3 register (SR1 has already been read) */
            (void)TCS34725_I2C->SR3;
            
            /* Send STOP Condition */
            I2C_GenerateSTOP( ENABLE);
           
            /* Call User callback for critical section end (should typically re-enable interrupts) */
            //sEE_ExitCriticalSection_UserCallback();
            
            /* Wait for the byte to be received */
            TCS34725_TimeOut = DEFAULT_TIMEOUT;
            while(I2C_GetFlagStatus( I2C_FLAG_RXNOTEMPTY) == RESET)
            {
              if((TCS34725_TimeOut--) == 0) return 33;
            }
            
            /* Read the byte received from the EEPROM */
            tmp = I2C_ReceiveData();
            
            /* Decrement the read bytes counter */
            //(uint16_t)(*NumByteToRead)--;        
            
            /* Wait to make sure that STOP control bit has been cleared */
            TCS34725_TimeOut = DEFAULT_TIMEOUT;
            while(TCS34725_I2C->CR2 & I2C_CR2_STOP)
            {
              if((TCS34725_TimeOut--) == 0) return 22;
            }  
            
            /* Re-Enable Acknowledgement to be ready for another reception */
            I2C_AcknowledgeConfig( I2C_ACK_CURR);
        Sau khi I2C_GenerateSTART(ENABLE); thì nó báo cờ I2C_FLAG_BUSBUSY, nhờ các tiền bối gỡ giúp lỗi này.

        Mạch kết nối 2 ngoại vi i2c trên cùng 1 bus, điạ chỉ lần lượt là 0x29 và 0x39.
        bạn xem phần cứng kết nối đúng chưa? không đúng nó sẽ báo lỗi đó
        Lập Trình theo yêu cầu STM8S,MSP430,89S,Giải mã remote

        Comment


        • Nguyên văn bởi huunho1 Xem bài viết
          bạn xem phần cứng kết nối đúng chưa? không đúng nó sẽ báo lỗi đó
          Mạch đúng và chạy đc bình thường nhé bạn. Mình viết code i2c mềm chạy được ngon lành và vẫn dùng i2c mềm tới giờ vì chưa có tời gian quay lại tìm hiểu nguyên nhân lỗi i2c cứng.

          Comment


          • I2C cứng chạy ngon, tôi đã test trên RTC(DS1307 & BQ32000) thấy good cả.


            Add: 97 Quán Nam - Lê Chân - Hải Phòng.
            Tel: 031 518648 Phone: 0904 283 505

            Comment


            • i2c cứng trên stm8 hình như do phần cứng lỗi hay sao ấy

              Comment


              • Có đầu các cậu lỗi thì có
                Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                Comment


                • bác quế dương cho hỏi bác dùng con này trong trường hợp nào mà bị nhiễu vậy ạ? em dùng thấy nó là chíp 8 bít mạnh nhất và nhiều ngoại vi nhất,rẻ nhất.
                  Modun phát rf của bác có điện áp hoạt động bao nhiêu? tần số sóng mang bao nhiêu bác?
                  Lập Trình theo yêu cầu STM8S,MSP430,89S,Giải mã remote

                  Comment


                  • Nguyên văn bởi huunho1 Xem bài viết
                    bác quế dương cho hỏi bác dùng con này trong trường hợp nào mà bị nhiễu vậy ạ? em dùng thấy nó là chíp 8 bít mạnh nhất và nhiều ngoại vi nhất,rẻ nhất.
                    Modun phát rf của bác có điện áp hoạt động bao nhiêu? tần số sóng mang bao nhiêu bác?
                    Ai nói vs bác là con này là loại 8-bit mạnh nhất, nhiều ngoại vi nhất vậy .


                    Add: 97 Quán Nam - Lê Chân - Hải Phòng.
                    Tel: 031 518648 Phone: 0904 283 505

                    Comment


                    • huu nho nói với mình thế? vậy có con mạnh hơn à bạn?
                      Lập Trình theo yêu cầu STM8S,MSP430,89S,Giải mã remote

                      Comment


                      • huu nho là ai vậy bạn?? Lại còn có cả "huunho1" nữa kìa @@_


                        Add: 97 Quán Nam - Lê Chân - Hải Phòng.
                        Tel: 031 518648 Phone: 0904 283 505

                        Comment


                        • Nguyên văn bởi huunho1 Xem bài viết
                          bác quế dương cho hỏi bác dùng con này trong trường hợp nào mà bị nhiễu vậy ạ? em dùng thấy nó là chíp 8 bít mạnh nhất và nhiều ngoại vi nhất,rẻ nhất.
                          Modun phát rf của bác có điện áp hoạt động bao nhiêu? tần số sóng mang bao nhiêu bác?
                          Áp 12V, tần số 438,5 Mhz
                          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                          Comment


                          • Nguyên văn bởi hoangdai Xem bài viết
                            huu nho là ai vậy bạn?? Lại còn có cả "huunho1" nữa kìa @@_
                            Anh cứ nghĩ là 1 người .
                            Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                            Comment


                            • Nguyên văn bởi queduong Xem bài viết
                              Anh cứ nghĩ là 1 người .
                              Mấy chuyện bàn cãi chip này tốt chip kia dỏm, chip này rẻ chip kia đắt thì trên diễn đàn này bàn quá nhiều rồi. Mình thiết nghĩ chỉ bàn mấy chuyện này trên bàn trà chanh , cafe là hợp thôi , bàn trên đây nó ko hợp thời nữa rồi.... v v Bác nào dùng con nào cứ dùng, ko nên chê bai bĩu môi chip khác .

                              Thêm nữa là cũng đừng đổ tội oan cho mấy em MCU, nó chạy đúng lắm đấy, mình làm sai nó thể hiện liền . Cả 1 hãng chứ có phải mấy anh kĩ sư tèng ngồi vẽ nhăng vẽ cuội ra đâu. Bạn cứ làm đi là biết liền . Còn chuyện nhiễu làm ảnh hưởng này khác thì nó là vấn đề muôn đời muôn kiếp, khéo làm thì ấm .


                              Add: 97 Quán Nam - Lê Chân - Hải Phòng.
                              Tel: 031 518648 Phone: 0904 283 505

                              Comment


                              • Bác cho em hỏi là tầm xa của mạch phát bị ảnh hưởng thế nào khi điện áp giảm? nếu mạch phát RF của bác xài 3v thì nó có phát được tầm 30m không ạ?
                                Lập Trình theo yêu cầu STM8S,MSP430,89S,Giải mã remote

                                Comment

                                Về tác giả

                                Collapse

                                sugus Tìm hiểu thêm về sugus

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X