IoTCore I2C

10256 단어 Windows10IoTCore
I2C API를 조사했습니다.
전제 조건
  • Raspberry Pi 2
  • Windows 10 IoT Core 10.0.10586.218
  • Visual Studio 2015 14.0.25123.00 Update 2
  • LSM9DS1
  • 연결선

    방법
    1. 사용된 I2C 컨트롤러의 장치 ID를 가져옵니다.
    string aqs = I2cDevice.GetDeviceSelector(friendlyName);
    var dis = await DeviceInformation.FindAllAsync(aqs);
    // dis[0].Id がデバイスID
    
    구체적인 값은 이것이다."\?\ACPI#MSFT8000#1#{a11ee3c6-8421-4202-a3e7-b91ff90188e4}\I2C1"
    2. I2C에 연결된 장치 인스턴스를 생성합니다.
    주소로부터 실례를 생성합니다.
    종속 주소를 지정해야 합니다.
    버스 속도공유 모드를 지정할 수 있습니다.
    var device = await I2cDevice.FromIdAsync(dis[0].Id, new I2cConnectionSettings(0x6b) { BusSpeed = I2cBusSpeed.FastMode, SharingMode = I2cSharingMode.Exclusive, });
    
    3. 장치를 실행하는 방법.
    필요에 따라 Write/Read/WriteRead 방법을 실행합니다.
    WriteRead 방법은 Write 다음에 Restart Condition에서 읽는 것입니다.
    device.Write(new byte[] { 0x20, 0xc0, });
    var data = new byte[6];
    device.WriteRead(new byte[] { 0x28 }, data);
    
    Write 메서드의 물결.

    WriteRead 메서드의 물결.

    염두에 두고 조사하는 일
    공유 모드의 Exclussive는 어떤 단위로 배타적입니까?
    주소 단위로 배타적이다.
    예를 들어, Exclussive는 종속 주소 0x6b와 0x6c를 모두 생성할 수도 있습니다.주소 0x6b와 0x6b에서는 사용할 수 없습니다.다음 반환 값이 비어 있습니다.
    공유 모드의 Exclussive가 Shared보다 빠릅니까?
    여분의 처리가 없으니 빠르지 않습니까?나는 통신 시간을 측정했지만 뚜렷한 차이가 없다고 생각한다.
    장치 단위로 버스 속도를 지정할 수 있습니다. 즉, 같은 I2C 버스에 혼합할 수 있습니까?
    네.
    Shared에서 버스 속도가 다른 장치의 실례를 만들어 운행해 본 결과 각자 지정한 버스 속도로 통신을 진행했다.
    좀 편해요.
    100K/400K 블렌드 파형.

    샘플 코드
    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        Task.Run(I2cTask);
    }
    
    private async Task I2cTask()
    {
        var device = await GetI2cDevice("I2C1", 0x6b, I2cBusSpeed.FastMode);
        device.Write(new byte[] { 0x20, 0xc0, });   // CTRL_REG6_XL = 0b11000000
    
        var data = new byte[6];
        for (;;)
        {
            device.WriteRead(new byte[] { 0x28 }, data);    // OUT_X_XL, OUT_Y_XL, OUT_Z_XL
            Debug.WriteLine("{0} {1} {2}", BitConverter.ToInt16(data, 0), BitConverter.ToInt16(data, 2), BitConverter.ToInt16(data, 4));
        }
    }
    
    private async Task<I2cDevice> GetI2cDevice(string friendlyName, int slaveAddress, I2cBusSpeed busSpeed = I2cBusSpeed.StandardMode, I2cSharingMode sharingMode = I2cSharingMode.Exclusive)
    {
        string aqs = I2cDevice.GetDeviceSelector(friendlyName);
        var dis = await DeviceInformation.FindAllAsync(aqs);
    
        return await I2cDevice.FromIdAsync(dis[0].Id, new I2cConnectionSettings(slaveAddress) { BusSpeed = busSpeed, SharingMode = sharingMode, });
    }
    

    좋은 웹페이지 즐겨찾기